Odpowiedzi:
Możesz użyć asercji z wyprzedzeniem:
(?!999)\d{3}
W tym przykładzie dopasowano trzy cyfry inne niż 999
.
Ale jeśli nie masz implementacji wyrażenia regularnego z tą funkcją (zobacz Porównanie smaków wyrażeń regularnych ), prawdopodobnie będziesz musiał samodzielnie zbudować wyrażenie regularne z podstawowymi funkcjami.
Zgodne wyrażenie regularne tylko z podstawową składnią wyglądałoby tak:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
To również pasuje do dowolnej sekwencji trzech cyfr, która nie jest 999
.
Jeśli chcesz dopasować słowo A w ciągu, a nie dopasować słowa B. Na przykład: Jeśli masz tekst:
1. I have a two pets - dog and a cat
2. I have a pet - dog
Jeśli chcesz wyszukać wiersze tekstu, które MAJĄ psa dla zwierzaka i NIE MA kota , możesz użyć tego wyrażenia regularnego:
^(?=.*?\bdog\b)((?!cat).)*$
Znajdzie tylko drugą linię:
2. I have a pet - dog
findstr
polecenia DOS . Zapewnia tylko niewielki podzbiór możliwości, które można znaleźć w narzędziu regex; nie ma wśród nich lookahead. (Właśnie sam dodałem tag findstr .)
Dopasuj do wzorca i użyj języka hosta, aby odwrócić wynik logiczny dopasowania. Będzie to znacznie bardziej czytelne i łatwiejsze w utrzymaniu.
nie, wskrzeszając to starożytne pytanie, ponieważ miało proste rozwiązanie, o którym nie wspomniano. (Znalazłem swoje pytanie podczas szukania informacji o zleceniu zlecenia regex .)
Mam do czynienia z sytuacją, w której muszę dopasować wzór (A i ~ B).
Podstawowe wyrażenie regularne do tego jest przerażająco proste: B|(A)
Po prostu zignorujesz ogólne dopasowania i przeanalizujesz przechwytywania z Grupy 1, które będą zawierać A.
Przykład (ze wszystkimi zastrzeżeniami dotyczącymi analizowania html w wyrażeniu regularnym): A to cyfry, B to cyfry w <a tag
Wyrażenie regularne: <a.*?<\/a>|(\d+)
Demo (spójrz na grupę 1 w prawym dolnym panelu)
Odniesienie
\d
z [[:digit:]]
. Pierwsza wzmianka o tym jest specyficzna dla Perla i PHP: „Istnieje odmiana składni specyficzna dla Perla i PHP, która zapewnia to samo”.
Uzupełnieniem języka regularnego jest również język regularny, ale aby go skonstruować, musisz zbudować DFA dla języka regularnego i wprowadzić każdą poprawną zmianę stanu na błąd. Zobacz to jako przykład. Strona nie mówi, że została przekonwertowana /(ac|bd)/
na /(a[^c]?|b[^d]?|[^ab])/
. Konwersja z DFA z powrotem na wyrażenie regularne nie jest trywialna. Łatwiej będzie, jeśli możesz użyć niezmienionego wyrażenia regularnego i zmienić semantykę w kodzie, tak jak sugerowano wcześniej.
Moja odpowiedź może również rozwiązać Twój problem:
https://stackoverflow.com/a/27967674/543814
$1
, przeczytałbyś grupę $2
.$2
została tam pozbawiona przechwytywania, czego można by uniknąć.Przykład:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
Pierwsza grupa przechwytywania określa wzorzec, którego chcesz uniknąć. Ostatnia grupa przechwytująca obejmuje wszystko inne. Wystarczy odczytać tę grupę $2
.
findstr
tag, ponieważ wszystkie odpowiedzi tutaj nie są prawidłowe dla tagu.