Chcę uzyskać wszystkie bloc, które zaczynają się od "-" i nie zaczynają się od "- Błąd" i "- nie powiodło się"

Oto moje wyrażenie regularne:

^- .*(?:\r?\n(?!- ).*)*

Demo w REGEX101.

1
TheRight 23 marzec 2020, 19:55

2 odpowiedzi

Najlepsza odpowiedź

Możesz użyć negatywnego lookhead dla pierwszego asercji dopasowywania bez błędów ani nie powiodło i dopasować wszystkie następne linie, które nie zaczyniają od - i przestrzeni, aby uzyskać oddzielne bloki:

^- (?!ERROR|FAILED).*(?:\r?\n(?!- ).*)*

Wzór będzie teraz dopasowany:

  • ^ Początek ciągu
  • - mecz - i przestrzeń
  • (?!ERROR|FAILED).* Assert, co jest bezpośrednio po prawej stronie, nie jest błędem lub nie powiodło się
  • (?: grupa nie przechwytywania
    • {x1}} Dopasuj nową linię, asert nie - i przestrzeń na początku i dopasowuje dowolne CHAR 0+ razy
  • )* Zamknij grupę i powtórz ponad 0 razy

Demo Regex

1
The fourth bird 23 marzec 2020, 17:12

Poniższy wzór wydaje się działać, przynajmniej za pomocą narzędzia demo:

- TEST\b.*?(?=- (?:ERROR|TEST|FAILED)|$)

Próbny

Wzór mówi do:

- TEST\b                       match "- TEST" followed by a word boundary
.*?                            then match all content up until looking ahead and seeing
(?=- (?:ERROR|TEST|FAILED)|$)  the start of another block with ERROR, TEST, or FAILED

Należy pamiętać, że używam kropki całego trybu, a także wyłączałem ^ i $ kotwice, takie, że oznaczają to początek i koniec całego wejścia (a nie każdej linii).

1
Tim Biegeleisen 23 marzec 2020, 17:05