2015-10-20 1 views
1

У меня есть следующий сценарий, где у меня есть набор фраз, некоторые из них - несколько слов, некоторые - одни, я хотел бы соответствовать всем этим фразы, но с моим нынешним подходом я в конечном итоге одиночными словаRegex - Сопоставьте два слова или одно слово, но отдайте предпочтение двум словам

Для примера:

вещи, которые я мог бы соответствовать:

  • солнечный день
  • солнечная долина
  • день

Regex: (sunny()day|sunny()valley|day)

Приговор: сегодня солнечный день

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

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

+0

У вас есть группы для пробелов. Это специально? –

+0

@emartinelli не специально, я просто хотел указать пространство прямо там, не получая смешанных результатов, может быть, есть лучший способ сделать это? – perrohunter

+0

Вы можете использовать '\ s' для представления пробела. Но даже используя «реальное пространство», вам не нужны скобки, потому что в этом случае они будут генерировать дополнительные совпадения. Например: используя ответ @stribizhev и ваш ввод, «солнечный день» и пробел будут сопоставлены. Чтобы не соответствовать этому дополнительному пространству, используйте '\ b (sunny \ sday | sunny \ svalley | day) \ b' [(demo)] (https://regex101.com/r/iS9bY7/1) –

ответ

2

Ваше регулярное выражение совпадает с «днем» внутри «сегодня», так как оно является самой левой (первой) «дневной» подстрокой во входной строке.

границы Используйте слово, чтобы соответствовать только целые слова:

\b(sunny()day|sunny()valley|day)\b 

См regex demo

+1

, что и было, Я действительно использовал \ b в моем коде, создаваемом regex (\ bsunny() day \ b | \ bday \ b), но я не получил желаемого результата, с вашим предложением вне группы, теперь я получаю самый длинный матч, спасибо ! отметит как правильный ответ за 10 минут :) – perrohunter

1

Чтобы не создавать дополнительные матчи пространств. После комментария OP. Я предлагаю это Regex:

\b(sunny\sday|sunny\svalley|day)\b(demo)


Ps .:

\s для пространств

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

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