/ / Wyodrębnianie części ciągu za pomocą regex - regex

Wyodrębnianie części ciągu za pomocą wyrażenia regularnego - regex

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”

  1. Tekst: „stół” Oczekiwany wynik: jadalnia
  2. Tekst: „stół kuchenny” Dopasowanie: gotowanie
  3. Tekst: „gotowanie” Dopasowanie: gotowanie
  4. Tekst: „table” Match: „”

Odpowiedzi:

1 dla odpowiedzi № 1

Jeś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.

wprowadź opis obrazu tutaj

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