Próbuję wyodrębnić część ciągów poniżej
Próbowałem (. *) (?: tabela) ?, to kończy się niepowodzeniem w ostatnim przypadku. Jak sprawić, by wyrażenie przechwytywało cały ciąg bez tekstu „table”
- Tekst: „stół” Oczekiwany wynik: jadalnia
- Tekst: „stół kuchenny” Dopasowanie: gotowanie
- Tekst: „gotowanie” Dopasowanie: gotowanie
- Tekst: „table” Match: „”
Odpowiedzi:
1 dla odpowiedzi № 1Jeśli chcesz użyć wyrażenia regularnego, możesz użyć tego:
(^.*)(?=table)|(?!.*table.*)(^.+)
Zobacz demo tutaj: regex101
Chodzi o to: dopasuj wszystko od początku linii ^
aż do słowa table
lub jeśli nie znajdziesz tabeli w ciągu, dopasujco najmniej jeden symbol. (aby uniknąć dopasowania pustych linii). Tak więc, gdy znajdzie tablicę słów, zwróci pusty ciąg znaków (ponieważ pasuje od początku wiersza do tablicy słów).
2 dla odpowiedzi nr 2
Zamiast próbować dopasować wszystko, ale table
, powinieneś wykonać operację zamiany, która usuwa tekst table
.
W zależności od języka może to nawet nie wymagać wyrażenia regularnego. Na przykład w Javie możesz użyć:
String output = input.replace("table", "");
1 dla odpowiedzi nr 3
The (.*)(?:table)?
kończy się niepowodzeniem table
(pasuje do niego) jako pierwsza grupa (.*)
jest chciwa kropka pasujący wzorzec, który chwyta cały ciąg do Grupy 1. Silnik regex cofa się i szuka table
w opcjonalnej grupie nie przechwytującej i dopasowuje pusty ciąg na końcu łańcucha.
The regex trik polega na dopasowaniu dowolnego tekstu, który się nie zaczyna table
przed grupa opcjonalna:
^((?:(?!table).)+)(?:table)?$
Widzieć wersja demonstracyjna regex
Teraz grupa 1 - ((?:(?!table).)+)
- zawiera hartowany żarłoczny żeton (?:(?!table).)+
który pasuje do 1 lub więcej znaków innych niż nowa linia, które nie rozpoczynają a table
sekwencja. Zatem pierwsza grupa nigdy nie będzie pasować table
.
Kotwice sprawiają, że regex pasuje do całej linii.
UWAGA: Rozwiązania inne niż wyrażenia regularne mogą jednak okazać się bardziej wydajne, ponieważ temperament chciwy token pochłania zasoby.
UWAGA2: Rozwijanie temperowanego chciwego tokena zwykle zwiększa wydajność n razy:
^([^t]*(?:t(?!able)[^t]*)*)(?:table)?$
Widzieć kolejne demo
Ale zwykle wygląda „tajemniczo”, „nieczytelnie” i „nie da się go utrzymać”.
1 dla odpowiedzi nr 4
Pomimo innych świetnych odpowiedzi, możesz również użyć alternacji:
^(?|(.*)table$|(.*))$
Wykorzystuje to reset gałęzi, więc pożądanetreść jest zawsze przechowywana w grupie 1. Jeśli wybrany język / narzędzie tego nie obsługuje, należy sprawdzić, która z grup 1 i 2 zawiera ciąg znaków.
Widzieć Próbny