2012-03-07 2 views
3

У меня есть массив ключевых слов, и я хочу знать, найдено ли хотя бы одно из ключевых слов в некоторой строке, которая была отправлена. Я также хочу быть абсолютно уверенным, что это ключевое слово, которое было сопоставлено, а не то, что очень похоже на слово.Проблема со словом-границей ( b)

Скажите, например, что наши ключевые слова: [English, Eng, En], потому что мы ищем некоторые варианты английского языка.

Теперь скажите, что вход пользователя i h8 eng class или что-то в равной степени провокационное и неграмотное - тогда необходимо сопоставить eng. Он также должен не соответствовать слову вроде england или какой-то странной вещи chen, хотя у него есть бит en.

Итак, в моем бесконечном отсутствии мудрости я полагал, что я мог бы сделать что-то вдоль линий это для того, чтобы соответствовать одному из моих элементов массива с входом:

.match(RegExp('\b('+array.join('|')+')\b','i')) 

С мышлением, что регулярным выражение будут искать совпадения из массива, теперь представленные как (English|Eng|En), а затем посмотрите, были ли границы слова с нулевой шириной с обеих сторон.

+1

+1 заставила меня смеяться – cambraca

ответ

5

Необходимо double обратная косая черта.

Когда вы создаете регулярное выражение с помощью конструктора RegExp(), вы передаете строку. Строковый синтаксис строки строки также рассматривает обратную косую черту как метасимвол, для цитирования цитат и т. Д. Таким образом, обратная косая черта будет эффективно удалена до код RegExp() даже работает!

При удвоении их, шаг разбора строки оставит позади обратную косую черту. Затем анализатор RegExp() увидит одиночную обратную косую черту перед «b» и сделает правильную вещь.

+0

Это, кажется, делает все, лучше! Как гипс, когда ты маленький. Большое спасибо, спасибо. – tesc

3

Вы должны удвоить слеш строки JavaScript или вы будете кодировать Backspace характер:

.match(RegExp('\\b('+array.join('|')+')\\b','i')) 
1

Вам нужно дважды избежать \b, потому что она имеет особое значение в строках:

.match(RegExp('\\b('+array.join('|')+')\\b','i')) 
1

\b является последовательность символов внутри строковых литералов (смотрите таблицу 2.1 на this page). Вы должны избежать этого, добавив один дополнительный слэш:

.match(RegExp('\\b('+array.join('|')+')\\b','i')) 

Вам не нужно, чтобы избежать \b при использовании в регулярном выражении литерала:

/\b(english|eng|en)\b/i 
Смежные вопросы