我尝试使用正则表达式构建搜索,该表达式使用特定术语来分割和过滤搜索查询。例如,如果我有一个类似的查询:
artist rolling stones track stupid girl track paint it black
,它将拉出滚石乐队的专辑并将曲目愚蠢的女孩画上黑色。理想情况下(经过一些处理后)我将数据发送到服务器,如下所示:{ artists : ['rolling stone'], tracks : ['stupid girl', 'paint it black'] }
。
我有一个基本的正则表达式,它匹配关键字(艺术家/曲目)和关键字后面的第一个单词(滚动/愚蠢/绘画),但是如果我使它与空格和后面的单词匹配,它只匹配整个字符串。
这是我目前拥有的正则表达式:(artist|track)\s([\w]+)
。我猜我需要使用停用词或其他东西来创建短语之间的边界,但我对建立正则表达式没有超级经验。任何帮助将不胜感激。
答案 0 :(得分:3)
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']
答案 1 :(得分:3)
(artist|track).*?(?=artist|track|$)
试试这段代码