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.