2009-08-26 6 views
15

Chciałbym zanegować zestaw słów za pomocą regex java.Negowanie zestawu słów za pomocą regex java

Powiedz, chcę zanegować: cvs, svn, nvs, mvc. Napisałem wyrażenie regularne, które jest ^[(svn|cvs|nvs|mvc)].

Niektóre z nich wydają się nie działać.

+1

Możliwy duplikat: http://stackoverflow.com/questions/42990/regex-to-match-against-something-that-is-not-a-specific-substring – finnw

+2

Zobacz również: http://stackoverflow.com/questions/406230/regular-expression-to-match-string-not-containing-a-word – finnw

+1

... i http://stackoverflow.com/questions/717644/ Regular-expression-that-doesnt-contain-certain-string – finnw

Odpowiedz

4

To nie jest takie proste. Jeśli chcesz zanegować słowo, musisz podzielić je na litery i zanegować każdą literę.

więc zanegować

/svn/ 

trzeba napisać

/[^s][^v][^n]/ 

Więc co chcesz odfiltrować zamieni się naprawdę brzydkiego regex i myślę, że to lepszy pomysł, aby użyć tego wyrażenia regularnego

/svn|cvs|nvs|mvc/ 

a kiedy przetestujesz swój ciąg przeciwko niemu, po prostu zaneguj wynik.

W JS będzie to wyglądać mniej więcej tak:

!/svn|cvs|nvs|mvc/.test("this is your test string"); 
+0

prawdopodobnie nie jest to poprawne, ponieważ nie pasujesz do początku^i końca $ ciągu znaków – pvoosten

+0

Szukam dowolnego słowa na dowolnej pozycji w ciągu testowym. Jeśli chcesz dopasować tylko całe słowa, to^na początku i $ na końcu zrobi lewy. – RaYell

2

Twój regex jest źle. Między nawiasami kwadratowymi możesz umieszczać postacie wymagające lub zignorować. Jeśli nie znajdziesz ^(svn|cvs|nvs|mvc)$, nic ci nie jest.

+0

, które w rzeczywistości nie są pomocne, ponieważ nie jest to czysto wyrażeń regularnych. jeśli nie musisz zmieniać kodu, nie rozwiąże to problemu z kontrolą jakości. – Alex