2015-03-17 2 views
0

Я пытаюсь построить поиск с использованием регулярного выражения, которое использует определенные термины для разделения и фильтрации поискового запроса. Например, если у меня есть такой запрос, как: artist rolling stones track stupid girl track paint it black, он вытаскивает альбомы, которые принадлежат Rolling Stones, и имеет трековую тупую девушку и рисует ее черным. В идеале (после небольшой обработки) я отправил данные на сервер следующим образом: { artists : ['rolling stone'], tracks : ['stupid girl', 'paint it black'] }.Фильтрование ключевых слов с регулярным выражением

У меня есть основное регулярное выражение, которое соответствует ключевому слову (художнику/дорожке) и первому слову после ключевого слова (roll/stupid/paint), однако, если я сделаю его совпадающим с пробелами и словами после, он просто соответствует целая строка.

Это регулярное выражение, которое у меня есть: (artist|track)\s([\w]+). Я предполагаю, что мне нужно использовать стоп-слова или что-то, чтобы создать границу между фразами, но я не супер опыт с созданием регулярного выражения. Любая помощь будет принята с благодарностью.

+0

пожалуйста, вы можете разместить свой вход и выход ясно? – parthi

+0

Вход: 'художник катящийся камень трек глупый девушка трек краска это черный'. Я хочу, чтобы регулярное выражение находило фразы: «художник катящийся камень», «трек глупые девушки», «трек краска черная». – RoryGilchrist

+0

В строке запроса может быть неограниченное количество фраз 'artist artist name' и' track track name'. Там могут быть и следы или просто художник, или, может быть, даже наоборот. Это достаточно ясно для вас? – RoryGilchrist

ответ

3
(artist|track).*?(?=artist|track|$) 

попробуйте этот код

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'] 
+0

Хорошо, так что работает в самом конкретном случае, когда у меня есть один художник и два трека. Как насчет того, есть ли у меня различное количество треков/исполнителей? – RoryGilchrist

+0

(artist | track). *? (? = Artist | track | $) попробуйте это – parthi