Regulärer Ausdruck für Zeichenfolgen, die mit "Stopp" beginnen

97

Wie erstelle ich einen regulären Ausdruck, der mit einem Wort am Anfang einer Zeichenfolge übereinstimmt? Wir suchen nach Übereinstimmungen stopam Anfang einer Zeichenfolge und alles kann darauf folgen.

Zum Beispiel sollte der Ausdruck übereinstimmen:

stop
stop random
stopping

Vielen Dank.

Brad Mace
quelle

Antworten:

184

Wenn Sie nur Zeilen abgleichen möchten, die mit stop use beginnen

^stop

Wenn Sie Zeilen abgleichen möchten, die mit dem Wort stop beginnen, gefolgt von einem Leerzeichen

^stop\s

Oder wenn Sie Zeilen abgleichen möchten, die mit dem Wort stop beginnen, gefolgt von einem Leerzeichen oder einem anderen Nicht-Wort-Zeichen, das Sie verwenden können (sofern Ihr Regex-Geschmack dies zulässt)

^stop\W

Auf der anderen Seite stimmt das Folgende mit einem Wort am Anfang einer Zeichenfolge bei den meisten Regex-Aromen überein (in diesen Aromen entspricht \ w dem Gegenteil von \ W).

^\w

Wenn Ihr Geschmack nicht die Verknüpfung \ w hat, können Sie verwenden

^[a-zA-Z0-9]+

Seien Sie vorsichtig, dass diese zweite Redewendung nur Buchstaben und Zahlen entspricht, überhaupt kein Symbol.

Überprüfen Sie in Ihrem Regex-Flavour-Handbuch, welche Verknüpfungen zulässig sind und was genau zu ihnen passt (und wie sie mit Unicode umgehen).

Vinko Vrsalovic
quelle
27
+1 für die Verallgemeinerung Ihrer Antwort. Ich würde gerne mehr davon auf Stack Overflow sehen. Macht es meiner Meinung nach zu einer besseren Lernressource.
Jim
Wie kann man die Groß- und Kleinschreibung nicht berücksichtigen, dh mit Stop oder Stop oder sTop übereinstimmen?
Elton Garcia de Santana
Hängt von Ihrer Sprache ab ... Perl-kompatibel kann den I-Modifikator verwenden. / regex / i .NET RegexOptions.IgnoreCase und so weiter
Vinko Vrsalovic
Vergessen Sie nicht ^stop\b, was jede Grenze erlauben würde, einschließlich Zeilenende
Mad Physicist
80

Versuche dies:

/^stop.*$/

Erläuterung:

  • / charachters begrenzen den regulären Ausdruck (dh sie sind per se nicht Teil des Regex)
  • ^ bedeutet Übereinstimmung am Zeilenanfang
  • . gefolgt von * bedeutet, dass jedes Zeichen (.) beliebig oft (*) übereinstimmt.
  • $ bedeutet bis zum Ende der Zeile

Wenn Sie diesen Stopp erzwingen möchten, gefolgt von einem Leerzeichen, können Sie die RegEx folgendermaßen ändern:

/^stop\s+.*$/
  • \ s bedeutet ein beliebiges Leerzeichen
  • + Nach dem \ s muss nach dem Stoppwort mindestens ein Leerzeichen stehen

Hinweis: Beachten Sie auch, dass nach dem obigen RegEx dem Stoppwort ein Leerzeichen folgen muss! Es würde also nicht mit einer Zeile übereinstimmen, die nur Folgendes enthält: stop

Mike Dinescu
quelle
Nicht alle Sprachen verwenden Schrägstriche, um reguläre Ausdrücke abzugrenzen.
JAB
1
@Cat Megex: Genau deshalb habe ich die Erklärung hinzugefügt. Wenn Ihre Sprache etwas anderes verwendet, um den regulären Ausdruck abzugrenzen, ersetzen Sie das / durch das richtige Zeichen
Mike Dinescu
1
@Mez ja, und eine solche Redundanz erhöht sowohl die Klarheit als auch die Leistung rexegg.com/regex-optimizations.html#anchors
MarredCheese
28

Wenn Sie nach einem Wortstopp etwas nicht nur am Zeilenanfang abgleichen möchten, können Sie Folgendes verwenden: \bstop.*\b- Wort gefolgt von Zeile

Wort bis zum Ende der Zeichenfolge

Oder wenn Sie das Wort in der Zeichenfolge Verwendung übereinstimmen \bstop[a-zA-Z]*- nur die Worte , mit Stop - Start

Nur die Wörter, die mit beginnen, hören auf

Oder der Zeilenanfang mit Stopp nur ^stop[a-zA-Z]*für das Wort - nur das erste Wort
Die ganze Zeile ^stop.*- nur die erste Zeile der Zeichenfolge

Und wenn Sie jede Zeichenfolge abgleichen möchten, die mit stop beginnt, einschließlich Zeilenumbrüchen, verwenden Sie: /^stop.*/s- mehrzeilige Zeichenfolge, die mit stop beginnt

Wachs
quelle
19

Wie @SharadHolani sagte. Dies stimmt nicht mit jedem Wort überein, das mit " Stopp " beginnt.

. Nur wenn es am Anfang einer Zeile wie " Stop Go " steht. @ Waxo gab die richtige Antwort:

Dieser ist etwas besser, wenn Sie ein Wort finden möchten, das mit " stop " beginnt und nur Buchstaben von A bis Z enthält .

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

Das würde allen passen

Stopp (1)

Stopp zufällig (2)

Anhalten (3)

will aufhören (4)

bitte hör auf (5)

Aber

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

würde nur (1) bis (3) übereinstimmen, nicht aber (4) & (5)

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

Passt zu jedem Stoppwort (Stopp, Stopp, Stopp usw.)

Wenn Sie jedoch nur mit "stop" am Anfang einer Zeichenfolge übereinstimmen möchten

/^stop/

wird tun: D.

Mez
quelle
2
Dies wird übereinstimmen "nicht aufhören zu gehen"
Alex B
1
Dies stimmt nicht mit stop123 oder stop überein.
Verlorene Übersetzung
7

Wenn Sie etwas abgleichen möchten, das mit "Stopp" beginnt, einschließlich "Stopp", "Stopp" und "Stopp", verwenden Sie:

^stop

Wenn Sie mit dem Wort stop übereinstimmen möchten, gefolgt von etwas wie in "stop go", "stop this", aber nicht "stop" und nicht "stop", verwenden Sie:

^stop\W
Alex B.
quelle
0

Ich würde von einem einfachen Ansatz mit regulären Ausdrücken für dieses Problem abraten. Es gibt zu viele Wörter, die Teilzeichenfolgen anderer nicht verwandter Wörter sind, und Sie werden wahrscheinlich verrückt werden, wenn Sie versuchen, die einfacheren Lösungen, die bereits bereitgestellt wurden, zu stark anzupassen.

Sie benötigen mindestens einen naiven Stemming-Algorithmus (probieren Sie den Porter-Stemmer; in den meisten Sprachen ist kostenloser Code verfügbar), um zuerst Text zu verarbeiten. Bewahren Sie diesen verarbeiteten Text und den vorverarbeiteten Text in zwei separaten Arrays mit geteilter Aufteilung auf. Stellen Sie sicher, dass jedes nicht alphabetische Zeichen auch einen eigenen Index in diesem Array erhält. Welche Liste von Wörtern Sie auch filtern, halten Sie sie ebenfalls auf.

Der nächste Schritt wäre, die Array-Indizes zu finden, die mit Ihrer Liste der Stamm-Stopp-Wörter übereinstimmen. Entfernen Sie diese aus dem unverarbeiteten Array und verbinden Sie sie dann wieder mit Leerzeichen.

Dies ist nur geringfügig komplizierter, wird aber ein viel zuverlässigerer Ansatz sein. Wenn Sie Zweifel am Wert eines NLP-orientierten Ansatzes haben, sollten Sie sich mit Clbuttic-Fehlern befassen .

Robert Elwell
quelle
0

Wenn das Wort mit "Stopp" beginnen soll, können Sie das folgende Muster verwenden. "^ hör auf. *"

Dies stimmt mit Wörtern überein, die mit stop beginnen, gefolgt von irgendetwas.

Manisha Chaurasia
quelle
1
Könnten Sie nicht einfach verwenden "^stop"?
Stephen Rauch
Es hängt davon ab, ob. Während wir über die Java-Syntax sprechen, können wir das Pattern- und Matcher-Objekt für die Verwendung von Regex oder die direkte Verwendung der .matches () -Methode mit dem String-Objekt verwenden. Sie unterscheiden sich im Ergebnis wie folgt: 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
Dies stimmt nur überein, wenn das Wort am Zeilenanfang steht. Wenn Wörter, die mit "stop" beginnen, in der Mitte der Zeile oder am Ende stehen, stimmt dieser reguläre Ausdruck nicht überein. @StephenRauch Wenn Sie [az] * weglassen, erhalten Sie keine Wörter wie "Anhalten" als Ganzes. Im Fall von "Anhalten" erhalten Sie "Anhalten" und "Ping" würde fehlen.
Sedat Kilinc