У меня есть список слов, и я хочу сопоставить любую комбинацию этих слов. Предположим, у меня есть слова apple, orange и mango, и я работаю со следующей строкой:

This place has the best apple pie. They also have orange, apple and mango-apple smoothie ... 

Регулярное выражение, которое у меня есть, это \b((apple|orange|mango)[\s-(,\s)]*)+

Он соответствует правильной комбинации слов, но, кроме того, соответствует дополнительному пробелу в конце последовательности. Спички, которые я получаю:

"apple "
"orange, apple "
"mango-apple "

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

2
mbsheikh 18 Фев 2013 в 09:57

1 ответ

Лучший ответ

Добавление \b в конце, кажется, сработало для меня. Кроме того, - следует ставить последним в квадратных скобках. Итак, все, что вам нужно сделать, это изменить ваше регулярное выражение на это: \b((apple|orange|mango)[\s(,\s)-]*)+\b

РЕДАКТИРОВАТЬ:

Согласно вашему комментарию, я пробовал это: \b((apple|orange|mango)([\s,-]+(apple|orange|mango))*)+\b. Проблема с вашим текущим регулярным выражением заключается в том, что вы также добавляете пробелы в конце, чтобы, например, вы могли сопоставить apple mango.

Предлагаемое мной регулярное выражение должно соответствовать пробелам, тире или запятым тогда и только тогда, когда за ними следуют слова apple, orange или mango.

3
npinti 18 Фев 2013 в 10:13
\ B в конце не работает. Примечание: ** использовались для обозначения совпадений, которые я хотел. Я удалил их, чтобы избежать путаницы.
 – 
mbsheikh
18 Фев 2013 в 10:07
@mbsheikh: Понятно. Я внес некоторые правки. Новое регулярное выражение должно соответствовать тому, что вам нужно.
 – 
npinti
18 Фев 2013 в 10:13