Я ударял головой об это в течение некоторого времени теперь: Я хочу получить все [a-z]+[0-9]?
последовательности символов, исключая строки такой как sin|cos|tan
и т.д. Так сделавший мою regex домашнюю работу следующий regex должен работать:
(?:(?!(sin|cos|tan)))\b[a-z]+[0-9]?
Поскольку Вы видите, что я использую отрицательное предвидение наряду с чередованием - \b
после того, как закрывающая скобка негруппы фиксации очень важна, чтобы не соответствовать in
из sin
и т.д. regex имеет смысл, и на самом деле я попробовал его RegexBuddy и Java как целевая реализация и получаю требуемый результат, но он не работает с помощью Java объекты Шаблона и Matcher! Какие-либо мысли?
удачи
\ b
находится не в том месте. Он будет искать границу слова, в которой не было sin / cos / tan до . Но граница сразу после у любого из них будет буква в конце, поэтому она должна быть границей конца слова, чего не может быть, если следующим символом будет a-z.
Кроме того, отрицательный просмотр вперед (если бы он работал) исключал такие строки, как cost
, что, я не уверен, вам нужно, если вы просто отфильтровываете ключевые слова.
Я предлагаю:
\b(?!sin\b|cos\b|tan\b)[a-z]+[0-9]?\b
Или, проще говоря, вы могли бы просто сопоставить \ b [a-z] + [0-9]? \ B
и затем отфильтровать строки в списке ключевых слов. Вам не всегда нужно делать все в регулярном выражении.
Итак, вы хотите [az] + [0-9]?
(последовательность как минимум из одной буквы, за которой может следовать цифра), , если эта последовательность букв не похожа на одну из sin
cos
tan
?
\b(?!(sin|cos|tan)(?=\d|\b))[a-z]+\d?\b
результатов:
cos - no match cosy - full match cos1 - no match cosy1 - full match bla9 - full match bla99 - no match
Я забыл экранировать \ b
для java, поэтому \ b
должно быть \\ b
, и теперь это работает.
Ура