2015-12-10 2 views
0

Я использую jQuery. Я должен проверить, указан ли данный список слов в абзаце или нет. Я хочу, чтобы точное совпадение слова или фразы (целое совпадение слов) .ie, если я ищу «быть» в «Быть ​​пчелой», существует только одно совпадение. Я сделал так.regex точное совпадение нескольких слов поиска с помощью jQuery

var searchText="tool,media,be,team"; 
var regexExactMatch = new RegExp('\^' + searchText.split(",").join("|") + '\$'); 
if (regexExactMatch.test(item.Name)) 
{ 
//Found 
} 

Он работает для одного поискового запроса, то есть без какой-либо запятой (например, носитель). Но для поиска по запятой, он сломается.

Как сделать точный поиск по поисковым запросам. Я очень новичок в регулярном выражении. Также я должен сделать тот же поиск для целых чисел и даты (MM/dd/yyyy). Заранее спасибо.

+1

Используйте 'new RegExp ('^ (?:' + searchText.split (", "). Join (" | ") + ') $');'. В противном случае анкеры применяются соответственно к первой и последней альтернативам. –

+0

Почему бы не поставить эти строки в массив? –

+1

Это не jQuery ... JavaScript есть. –

ответ

1

Удалите ^ с начала и $ с конца RegExp. Как это:

var regexExactMatch = new RegExp(searchText.split(",").join("|")); 

Причина

^ будет установить условие, что согласованный текст нужно быть в начале строки и $ установить условие, что Найденный текст должен быть в конце строки, которая может произойти только в том случае, если в строке есть только этот текст.

+1

С вашим подходом ведущие '(' и trailing ')' являются избыточными. # 2 просто неправильно. –

+1

['tool | media'] (https://regex101.com/r/nD5zO4/1) будет соответствовать либо инструменту, либо' media'. ['too (l | m) edia'] (https://regex101.com/r/nD5zO4/2) будет соответствовать либо' tooledia', либо 'toomedia'. –

+1

@ стробижев вы правы. Ред. Благодарю. –

1

Для полного ввода строки матч использования

new RegExp('^(?:' + searchText.split(",").join("|") + ')$'); 
      ^^^          ^

Для целого слова поиска, замены ^ и $ с \b:

new RegExp('\\b(?:' + searchText.split(",").join("|") + ')\\b'); 

В противном случае, анкеры применяются соответственно к первому и только последние альтернативы (т. е. ваше регулярное выражение будет выглядеть так, как /^tool|media|be|team$/ ищет tool только в начале, media и be в любом месте строки и team только в конце строки).

Примечание. Я использую (?:...) группу, не связанную с захватом, так как группировка нужна только здесь, а не для захвата (без сохранения подстановки). Если вам нужен доступ к совпадающему тексту, вы можете получить доступ к 0-й группе, которая равна всем совпадениям.

Кроме того, вам не нужны эти \ сек до ^ и $, они не нужны вообще и игнорируются в конструкторе нотации, так как нет экранирующих последовательностей, как \^ и \$.

Смежные вопросы