2009-08-23 8 views
20

Chcę dopasować dowolny ciąg, który ma nie zawierają ciąg "DontMatchThis".C# Regex, aby dopasować ciąg znaków, który nie zawiera określonego ciągu?

Co to jest wyrażenie regularne?

+0

Dlaczego chcesz to zrobić z regex i nie używać String.IndexOf? –

+12

Ponieważ czasami twoje wyrażenie regularne jest w config i nie możesz zmienić kodu. Lub dlatego, że potrzebujesz go jako podwyrażenie innego, bardziej złożonego wyrażenia regularnego. Lub z jednego z wielu powodów. Równie dobrze możesz zapytać: "Dlaczego nie nakarmisz swojego kota tekstem do ciebie za pośrednictwem tańca interpretacyjnego?". Czasami po prostu nie masz kota do ręki. –

Odpowiedz

45

spróbuj tego:

^(?!.*DontMatchThis).*$ 
+11

Proszę podać jakieś wyjaśnienie. Jak to działa? – bikashg

+0

@bikashg: patrz tutaj: http://stackoverflow.com/a/11125488/47190 –

11

regex pasujące ciąg znaków, który nie zawiera pewien wzór

(?s)^(?!.*DontMatchThis).*$ 

Jeśli używasz wzór bez (?s) (który jest wersja Inline flaga, która powoduje, że . pasuje do znaku nowej linii LF, jak również wszystkich innych znaków), zostanie wyszukana tylko w pierwszym wierszu, a tylko ciąg bez symboli LF zostanie dopasowany do .*.

Wzór Szczegóły:

  • (?s) - dotall/SingleLine modyfikator co . dowolny znak
  • ^ - start kotwicy strun
  • (?!.*DontMatchThis) - negative lookahead sprawdzenie, czy istnieją jakiekolwiek 0 lub więcej znaków (pasuje do chciwego .* subpattern - UWAGA leniweWersja 0 (pasująca jak najmniej znaków przed kolejnym dopasowaniem podrzędnym) może przyspieszyć wykonanie zadania, jeśli oczekuje się, że DontMatchThis jest bliżej początku ciągu znaków), a następnie DontMatchThis
  • .* - dowolne zero lub więcej znaków, o ile to możliwe, do
  • $ - koniec ciągu znaków (zob. Znaki zakotwiczenia: Dollar ($)).
+1

To jest dobry dodatek do zaakceptowanej odpowiedzi. – VMAtm