Я безуспешно пытаюсь найти решение этой проблемы: Чтобы найти Java-регулярное выражение, которое может распознать строку, содержащую одно слово, и не содержащее другое слово.Regex: содержит слово, не содержит другого слова
Чтобы быть более ясным, в качестве примера давайте проверим, содержит ли мое предложение «метод» и не содержит «эффективных» целых слов (что означает, что оно не должно быть частью другого слова). Регулярное выражение согласовань должна вернуться, например,:.
This method was efficient. false (contains "method", but contains "efficient")
This method was unefficient. true (cont. "method" doesn't cont. "efficient")
This method was simple. true (cont. "method" doesn't cont. "efficient")
This routine is efficient false (cont. "efficient" but no "method")
То, что я пытался до сих пор, по крайней мере, больше ближайших результатов решения.
(method)(?!.*efficient.*) Almost there, but "unefficient" also triggers.
(method)(?!.* efficient .*) No. Now " method " doesn't trigger anymore.
((.*method.*)(?!.*efficient.*)) No. the absence of "efficient" doesn't trigger.
Так что это проблема точного совпадения слов. Поэтому я также попытался вначале:
(.*\bmethod\b.*)(?!.*efficient.*)
Кроме того, чтобы не зависеть от пространств, чтобы связать каждое слово. Но ничего. Я пробовал почти целый день, и это больно.
Я использую http://www.regular-expressions.info/refquick.html в качестве справочного сайта и http://regexpal.com/ для тестирования.
Спасибо! D.
Почему вы не используете ['String # contains'] (http://docs.oracle.com/javase/7/docs/api/java /lang/String.html#contains(java.lang.CharSequence))? – Maroun
Хороший вопрос. Я хочу выполнить проверку набором таблиц сложных синтаксических строк. Например (в метаязыке): (+ word1) (- word2) -> Action1; ((+ word1) (- word3) || (word4)) -> Action2; – donnadulcinea
Что сказал Марун или просто «(? S)^(? =. * \\ bmethod \\ b) (?!. * \\ эффективный \\ b)'. '(? s)' заключается в том, чтобы установить модификатор 's' в соответствие с символами новой строки с' .' – HamZa