2010-11-03 4 views
3

J'ai besoin d'une regex pour faire correspondre les chaînes qui ne se terminent pas dans certains termes.regex pour la négation des extrémités avec correspondance

entrée est un tas de noms de classe, comme Foo, FooImpl, FooTest, FooTestSuite, etc.

Je veux correspondre à quelque chose qui ne se termine pas dans Test, Tests ou TestSuite.

doit correspondre:

  • FooImpl
  • FooTestImpl
  • Foo

ne doit pas correspondre:

  • FooTest
  • FooTestSuite
  • FooTests

Je ne peux pas obtenir ce droit. Ce que j'ai maintenant est faux alors je ne vais même pas le poster.

Répondre

4

Essayez un lookbehind négatif si votre langue supporte:

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

Sinon, vous pouvez simuler un lookbehind négatif en utilisant une préanalyse négative:

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

Rubular

+1

Réécrivez l'aspect négatif de longueur variable afin qu'il fonctionne plus d'endroits qu'un: '/ (? tchrist

+0

@tchrist: +1 oui c'est une bonne idée. Terminé. –

1

correspondant négatif est regex quelque chose ne peut pas faire pour la plupart. Y a-t-il une raison pour laquelle vous pouvez le faire! (String = ~ regex)? C'est pourquoi grep a un drapeau -v (invert match).

+0

+1: D'accord avec ne correspond pas à la non-existence, mais correspond plutôt à l'existence et inverser la correspondance. Bien plus facile. –

0

Je propose une solution alternative utilisant grep:

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

-v est la négation, -E est pour la correspondance des expressions régulières. Comme toutes les langues ne supportent pas les lookaheads et que lookbehinds et grep sont pour la plupart indépendants de la plateforme, cela pourrait être votre meilleur choix.

0

Vous pouvez essayer d'utiliser un opérateur de limite de mot:

test\b|tests\b|testSuite\b 

qui ciblera les mots qui se terminent par ces personnages.

Questions connexes