【问题标题】:Regular expression keyword filtering正则表达式关键字过滤
【发布时间】:2023-03-29 11:56:01
【问题描述】:

我正在尝试使用正则表达式构建搜索,该表达式使用特定术语来拆分和过滤搜索查询。例如,如果我有这样的查询: artist rolling stones track stupid girl track paint it black,它会拉出滚石乐队的专辑,并把曲目愚蠢的女孩涂成黑色。理想情况下(经过一些处理)我会像这样将数据发送到服务器:{ artists : ['rolling stone'], tracks : ['stupid girl', 'paint it black'] }

我有一个基本的正则表达式,它匹配关键字(艺术家/曲目)和关键字之后的第一个单词(滚动/愚蠢/绘画),但是如果我让它匹配空格和后面的单词,它只会匹配整个字符串。

这是我目前拥有的正则表达式:(artist|track)\s([\w]+)。我猜我需要使用停用词或其他东西来创建短语之间的边界,但我对构建正则表达式并不是很有经验。任何帮助将不胜感激。

【问题讨论】:

  • 你能把你的输入输出写清楚吗?
  • 输入:artist rolling stones track stupid girl track paint it black。我希望正则表达式找到以下短语:“艺术家滚石”、“追踪愚蠢的女孩”、“追踪将它涂成黑色”。
  • 查询字符串中可以有无限数量的artist artist nametrack track name 短语。也可能没有曲目,或者只有一位艺术家,甚至可能反过来。这对您来说是否足够清楚?

标签: javascript regex keyword-search


【解决方案1】:
(artist|track).*?(?=artist|track|$)

试试这个代码

【讨论】:

    【解决方案2】:
    use strict;
    use warnings;
    $string =~ s{artist\s*((?:(?!track|$).)+)track\s*((?:(?!track|$).)+)(?:track((?:(?!track|$).)+))?}{artists : ['$1'], tracks : ['$2','$3']}ig;
    

    试试这个代码。

    使用这个正则表达式

    artist\s*((?:(?!track|$).)+)track\s*((?:(?!track|$).)+)(?:track((?:(?!track|$).)+))?
    

    替换:

    artists : ['$1'], tracks : ['$2','$3']
    

    【讨论】:

    • 好的,这样在我有一位艺术家和两首曲目的非常具体的情况下有效。如果我有不同数量的曲目/艺术家怎么办?
    • (artist|track).*?(?=artist|track|$) 试试这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    相关资源
    最近更新 更多