Принуждение регулярного выражения к необязательным группам - PullRequest
1 голос
/ 04 января 2012

Я хочу найти строку «W foo X bar Y baz Z» в тексте. W, X, Y, Z - неважные разделители, и я не должен их искать. foo, bar и baz - это слова, которые меня интересуют. Порядок не так важен. Я хочу знать, насколько «хорошо» мои обязательные слова встречаются в тексте.

Я пытаюсь следующее

(?:\Qfoo\E)?.{0,3}(?:\Qbar\E)?.{0,3}(?:\Qbaz\E)?

Мои рассуждения таковы:

  • упакуйте каждое слово в необязательную группу, чтобы оно не появлялось [(?: это группа без захвата, \ Q ... \ E просто сбегает]
  • отделяйте каждое слово с помощью. {0,3} (любой символ, встречающийся 0-3 раза)

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

Могу ли я заставить Regex попытаться сопоставить все группы, насколько это возможно?

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

Большое спасибо

Ответы [ 2 ]

5 голосов
/ 04 января 2012

Я думаю, у вас возникнут трудности с решением вашей проблемы простым использованием Regex.

Предлагаю вам взглянуть на мощную функцию Scala с названием Parser Combinator.

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

Вот ясный и аккуратный пост, где вы 'Вы найдете соответствующую информацию об этом Parser Combinator .

Что можно сделать, это просмотреть ваш контент как

delim = "[a-z]{0,3}".r
value = "foo|bar|baz".r
expr = delim ~ value ~ expr

My 2c

2 голосов
/ 04 января 2012

Сначала подумайте, я бы попробовал регулярное выражение, подобное этому

(foo|bar|baz|anyothercombination)

и затем использовать свойство количества совпадений

(Нужно просто найти это и вернуться к вам, если вы хотите фрагмент)

...