2016-06-26 2 views
-1

Таким образом, для согласования всех слов на странице текста, я использую это:Соответствующие слова с пробелами

new RegExp("([a-zA-Z0-9\-]+)","ig"); 

Проблема в том, некоторые из вещей, которые я должен соответствовать может быть два слова, как " зеленый чай ", например. Так что я попытался это:

var pattern = new RegExp("([a-zA-Z0-9\-?]+\\s[a-zA-Z0-9\-_]+)","ig"); 

но проблема в том, что он не соответствует каждую двойную комбинацию слов, так что, возможно, это будет соответствовать «зеленым», «чайные листья». Я думаю, что, как это работает, по крайней мере, все, что я знаю, это не соответствует «зеленому чаю».

+1

Вас интересует более двух слов? –

+1

Здесь нет волшебной таблетки, потому что механизм регулярных выражений не может знать, что слова «зеленый чай» идут вместе, но «зеленым» нет, поэтому вам нужно будет перечислить все комбинации слов, которые вы хотите. рассматривать как единицу - или делать что-то после факта. –

+1

Итак, только для разъяснений, ввод «Мне нравится зеленый, чай хорош» должен возвращать массив «[« Мне нравится »,« Как зеленый »,« Зеленый чай »,« Чай есть »,« Хорошо », , 'good'] '? – Jonathan

ответ

0

Во-первых, как всегда, regexp101 - твой друг! :)

Во-вторых, [a-zA-z0-9] эквивалентно \ w. И если вы хотите добавить тире и вопросительные знаки в свое определение слова (как вам кажется), вы можете использовать [\ w-?].

Наконец, вы, вероятно, хотите, не захватывая группы, как это:

'((?:[\w-?]+(?:\s[\w-?]+)*))' 

, который говорит, что «найти слово, за которым следует ноль или более„пробела + слово“группа».

Тонкая настройка в регулярном выражении101 по вкусу.

Надеюсь, это поможет!

+0

Как это помогает с совпадением «зеленого чая», но не «зеленым»? –

+0

Вы правы: исходный вопрос не был корректным. Похоже, что г-н Слоцкий должен будет предоставить специальные дела. Но '\ w + (?: \ S \ w +) *' настолько идиоматичен (как и необходимость в regex101), который он повторяет. –

+0

Не могу сказать, что я нахожу вопрос неясным в этом вопросе. Другие пункты (которые полезны) - это * комментарии *, а не ответ. –

1

Здесь нет волшебной таблетки, потому что движок регулярного выражения не может знать, что слова «зеленый чай» идут вместе, но «зеленым» нет, поэтому вам нужно будет перечислить все словосочетания вы хотите, чтобы он рассматривался как единица   — или делал что-то раньше или после факта.

Например, это будет соответствовать словам в тексте, но лечить «зеленый чай», как одной игры:

var rex = /(green tea)|([a-zA-Z0-9\-']+)/ig; 
 
var str = "I like green tea, don't you?"; 
 
console.log(str.match(rex));

| является Чередованием означает «пытается соответствовать любому из этих альтернатив »(ранее альтернативы предпочтительнее более поздних).

Очевидно, что это было бы очень громоздким очень быстро, поэтому вам может потребоваться выходить за пределы регулярного выражения, как для предварительной обработки, так и для последующей обработки, чтобы обрабатывать список желаемых двухсловных слов.


Примечание: Я добавил ' ко второй половине, что, так как в противном случае «не» читался как «Дон» и «т».

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