регулярное выражение для отрицания концов с соответствием - PullRequest
3 голосов
/ 04 ноября 2010

Мне нужно регулярное выражение для сопоставления строк, которые не заканчиваются в определенных терминах.

Ввод - это набор имен классов, таких как Foo, FooImpl, FooTest, FooTestSuite и т. Д.

Я хочу сопоставить все, что не заканчивается Test, Tests или TestSuite.

Должно совпадать:

  • FooImpl
  • FooTestImpl
  • Foo

Не должно совпадать:

  • FooTest
  • FooTestSuite
  • FooTests

Я просто не могу понять это правильно. То, что я имею сейчас, неправильно, поэтому я даже не буду публиковать его.

Ответы [ 4 ]

4 голосов
/ 04 ноября 2010

Попробуйте отрицательный взгляд назад, если ваш язык поддерживает это:

/(?<!Test)(<?!Tests)(<?!TestSuite)$/

В противном случае вы можете смоделировать отрицательный взгляд сзади, используя отрицательный взгляд:

/^(?!.*(?:Test|Tests|TestSuite)$).*$/

Rubular

1 голос
/ 04 ноября 2010

Отрицательное соответствие - это то, что регулярное выражение не может сделать по большей части. Есть ли причина, по которой вы можете это сделать? (String = ~ regex)?

Именно поэтому у grep есть флаг -v (инвертированное совпадение).

0 голосов
/ 04 ноября 2010

Вы можете попробовать использовать оператор границы слова:

test\b|tests\b|testSuite\b

Это будет нацеливать слова, заканчивающиеся этими символами.

0 голосов
/ 04 ноября 2010

Я предлагаю альтернативное решение, используя grep:

grep -vE ".+(Test|Tests|TestSuite)$" *

-v - отрицание, -E - для соответствия регулярному выражению. Поскольку не все языки поддерживают lookaheads и lookbehinds, а grep в основном не зависит от платформы, это может быть лучшим выбором.

...