Dosłowny sposób powiedzenia „szukaj do, Xale nie uwzględniaj X” to:
(?:(?!X).)*
gdzie Xmoże być dowolne wyrażenie regularne.
W twoim przypadku może to być przesada - tutaj najłatwiej byłoby
[^z]*
Dopasuje to wszystko oprócz zi dlatego zatrzyma się tuż przed następnym z.
Więc .*?quick[^z]*będzie pasować The quick fox jumps over the la.
Jednak na przykład, gdy masz więcej niż jedną prostą literę, na którą musisz zwrócić uwagę, (?:(?!X).)*w grę wchodzi
(?:(?!lazy).)*- dopasuj wszystko, aż do początku słowa lazy.
To jest użycie asercji wyprzedzającej , a dokładniej negatywnej.
.*?quick(?:(?!lazy).)*będzie pasować The quick fox jumps over the.
Wyjaśnienie:
(?:
(?!lazy)
.
)*
Ponadto, podczas wyszukiwania słów kluczowych, możesz chcieć otoczyć je kotwicami granic słów: \bfox\bdopasuje tylko całe słowo, foxale nie będzie zawierał listu foxy.
Uwaga
Jeśli tekst, który ma zostać dopasowany, może również zawierać podziały wierszy, musisz ustawić opcję „kropka pasuje do wszystkich” w Twoim silniku wyrażeń regularnych. Zwykle można to osiągnąć, poprzedzając (?s)wyrażenie regularne, ale to nie działa we wszystkich silnikach wyrażeń regularnych (zwłaszcza JavaScript).
Alternatywne rozwiązanie:
W wielu przypadkach można również użyć prostszego, bardziej czytelnego rozwiązania, które wykorzystuje leniwy kwantyfikator. Dodając a ?do *kwantyfikatora, spróbuje dopasować jak najmniej znaków z bieżącej pozycji:
.*?(?=(?:X)|$)
dopasuje dowolną liczbę znaków, zatrzymując się tuż przed X(może to być dowolne wyrażenie regularne) lub na końcu ciągu (jeśli Xnie pasuje). Aby to zadziałało, może być konieczne ustawienie opcji „kropka pasuje do wszystkich”. (Uwaga: dodałem grupę bez przechwytywania X, aby niezawodnie odizolować ją od naprzemienności)
grep, ale ta odpowiedź działa.