Wyrażenie regularne do dopasowania ciągu zaczynającego się od „stop”


99

Jak utworzyć wyrażenie regularne, aby dopasować słowo na początku ciągu. Szukamy dopasowania stopna początku łańcucha i wszystko może po nim nastąpić.

Na przykład wyrażenie powinno pasować do:

stop
stop random
stopping

Dzięki.

Odpowiedzi:


187

Jeśli chcesz dopasować tylko linie zaczynające się od stop, użyj

^stop

Jeśli chcesz dopasować linie zaczynające się od słowa stop, po którym następuje spacja

^stop\s

Lub, jeśli chcesz dopasować wiersze zaczynające się od słowa stop, ale po którym następuje spacja lub dowolny inny znak niebędący słowem, którego możesz użyć (pozwala na to twój styl wyrażenia regularnego)

^stop\W

Z drugiej strony poniższy fragment dopasowuje słowo na początku ciągu w większości odmian wyrażenia regularnego (w tych smakach \ w odpowiada przeciwieństwu \ W)

^\w

Jeśli twój smak nie ma skrótu \ w, możesz użyć

^[a-zA-Z0-9]+

Uważaj, ponieważ ten drugi idiom będzie pasował tylko do liter i cyfr, bez żadnego symbolu.

Zapoznaj się z instrukcją obsługi wyrażeń regularnych, aby dowiedzieć się, jakie skróty są dozwolone i do czego dokładnie pasują (i jak radzą sobie z Unicode).


27
+1 za uogólnienie odpowiedzi. Chciałbym zobaczyć więcej tego na Stack Overflow. Moim zdaniem sprawia, że ​​jest to lepsze źródło wiedzy.
— Jim

Jak sprawić, by wielkość liter nie była rozróżniana, tj. Dopasuj Stop lub Stop lub sTop?
— Elton Garcia de Santana

Zależy od Twojego języka ... Kompatybilny z Perlem może używać modyfikatora I. / regex / i .NET RegexOptions.IgnoreCase i tak dalej
— Vinko Vrsalovic

Nie zapomnij ^stop\b, co pozwoliłoby na jakąkolwiek granicę, w tym koniec linii
— Mad Physicist

80

Spróbuj tego:

/^stop.*$/

Wyjaśnienie:

  • / znaki ograniczają wyrażenie regularne (tj. nie są częścią wyrażenia regularnego jako takie)
  • ^ oznacza dopasowanie na początku linii
  • . po którym następuje * oznacza dopasowanie dowolnego znaku (.), dowolną liczbę razy (*)
  • $ oznacza koniec wiersza

Jeśli chcesz wymusić, aby po zatrzymaniu występowały białe znaki, możesz zmodyfikować wyrażenie regularne w następujący sposób:

/^stop\s+.*$/
  • \ s oznacza dowolny biały znak
  • + następujące po \ s oznacza, że ​​po słowie pomijanym musi występować co najmniej jedna biała spacja

Uwaga: pamiętaj również, że powyższe wyrażenie RegEx wymaga, aby po słowie pomijanym następowała spacja! Więc nie pasuje do wiersza, który zawiera tylko: stop


Nie wszystkie języki używają ukośników do przodu do oddzielania wyrażeń regularnych.
— JAB

1
@Cat Megex: Właśnie dlatego dodałem wyjaśnienie. Jeśli twój język używa czegoś innego do oddzielenia wyrażenia regularnego, zamień / na właściwy znak
— Mike Dinescu

1
@Mez tak, a taka redundancja zwiększa zarówno przejrzystość, jak i wydajność rexegg.com/regex-optimizations.html#anchors
— MarredCheese

28

Jeśli chcesz dopasować cokolwiek po słowie, zatrzymaj się i nie tylko na początku linii, możesz użyć: \bstop.*\b- słowo, po którym następuje linia

Słowo do końca napisu

Lub jeśli chcesz dopasować słowo w ciągu, użyj \bstop[a-zA-Z]*- tylko słowa zaczynające się od stop

Tylko słowa zaczynające się od stop

Lub początek linii ze stoperem tylko ^stop[a-zA-Z]*dla słowa - tylko pierwsze słowo
Cały wiersz ^stop.*- tylko pierwsza linia ciągu

A jeśli chcesz dopasować każdy ciąg zaczynający się od stop, w tym znaki nowej linii, użyj: /^stop.*/s- łańcuch wielowierszowy zaczynający się od stop


20

Jak powiedział @SharadHolani. To nie będzie pasować do każdego słowa zaczynającego się od „ stop ”

. Tylko wtedy, gdy jest na początku linii, w stylu „ przestań jechać ”. @Waxo udzielił poprawnej odpowiedzi:

Ten jest nieco lepiej, jeśli chcesz dopasować żadnego słowa zaczynającego się na „ przystanku ” oraz zawierający jedynie litery od A do Z .

\bstop[a-zA-Z]*\b

To pasowałoby do wszystkich

stop (1)

zatrzymaj losowo (2)

zatrzymywanie (3)

chcę się zatrzymać (4)

proszę przestań (5)

Ale

/^stop[a-zA-Z]*/

będzie pasować tylko (1) do (3), ale nie (4) i (5)


8
/stop([a-zA-Z])+/

Dopasuje każde słowo pomijane (zatrzymanie, zatrzymanie, zatrzymanie itp.)

Jeśli jednak chcesz po prostu dopasować „stop” na początku ciągu

/^stop/

zrobi: D


2
To będzie mecz „Don't stop going”
— Alex B

1
To nie będzie pasować do stop123 ani stop.
— Lostintranslation

7

Jeśli chcesz dopasować wszystko, co zaczyna się od „stop”, w tym „przestań”, „stop” i „zatrzymuję”, użyj:

^stop

Jeśli chcesz dopasować słowo stop, po którym następuje cokolwiek, na przykład „przestań”, „zatrzymaj”, ale nie „zatrzymane” i „zatrzymane”, użyj:

^stop\W

0

Odradzałbym stosowanie prostych wyrażeń regularnych do tego problemu. Jest zbyt wiele słów, które są podciągami innych niepowiązanych słów i prawdopodobnie doprowadzisz się do szaleństwa, próbując przesadnie dostosować już dostarczone prostsze rozwiązania.

Będziesz potrzebował przynajmniej naiwnego algorytmu rymowania (wypróbuj lemmer Portera; w większości języków dostępny jest bezpłatny kod) do przetwarzania tekstu. Przechowuj ten przetworzony tekst i wstępnie przetworzony tekst w dwóch oddzielnych tablicach z podziałem na spacje. Upewnij się, że każdy znak niealfabetyczny również otrzymuje własny indeks w tej tablicy. Niezależnie od listy słów, które filtrujesz, również je powstrzymaj.

Następnym krokiem byłoby znalezienie indeksów tablicowych, które pasują do twojej listy słów „stop” z rdzeniem. Usuń je z nieprzetworzonej tablicy, a następnie dołącz ponownie w spacjach.

Jest to tylko nieco bardziej skomplikowane, ale podejście będzie znacznie bardziej niezawodne. Jeśli masz jakiekolwiek wątpliwości co do wartości podejścia bardziej zorientowanego na NLP, możesz zechcieć trochę zbadać błędy clbuttic .


0

Jeśli chcesz, aby słowo zaczynało się od „stop”, możesz użyć następującego wzoru. „^ stop. *”

To dopasuje słowa zaczynające się od stop, po którym następuje cokolwiek.


1
Czy nie mógłbyś po prostu użyć "^stop"?
— Stephen Rauch

To zależy. Mówiąc w kategoriach składni Javy, możemy użyć obiektu Pattern i Matcher do użycia regex lub bezpośredniego użycia metody .matches () z obiektem String. Różnią się wynikiem, jak poniżej: code String line = "stopped"; String pattern = "^stop"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(line); System.out.println(m.find( )); //prints true System.out.println(line.matches(pattern)); //prints false
— Manisha Chaurasia

1
To pasuje tylko wtedy, gdy słowo na początku wiersza. Jeśli słowa zaczynające się od „stop” znajdują się w środku linii lub na końcu, to wyrażenie regularne nie będzie pasować. @StephenRauch, jeśli pominiesz [az] *, nie otrzymasz w całości żadnych słów typu „zatrzymanie”. W przypadku „zatrzymania” pojawi się „stop” i nie będzie „ping”.
— Sedat Kilinc,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.