Regulärer Ausdruck, der einem Wort oder seinem Präfix entspricht

119

Ich möchte einem ganzen Wort einen regulären Ausdruck zuordnen.

Im folgende Beispiel versuche ich zu passen soder seasonaber , was ich Streichhölzer s, e, a, ound n.

[s|season]

Wie mache ich einen regulären Ausdruck, der zu einem ganzen Wort passt?

NMGod
quelle
4
Verwenden Sie (season|s)stattdessen. [season]entspricht einem s, e, a, o, n.
Falsetru

Antworten:

137

Eckige Klammern sind für die Zeichenklasse gemeint, und Sie versuchen , tatsächlich irgendeine der zum Spiel: s, |, s(wieder), e, a, s(wieder), ound n.

Verwenden Sie stattdessen Klammern für die Gruppierung:

(s|season)

oder nicht erfassende Gruppe:

(?:s|season)

Hinweis: Nicht erfasste Gruppen teilen der Engine mit, dass die Übereinstimmung nicht gespeichert werden muss, während die andere (Erfassungsgruppe). Bei kleinen Dingen, die entweder funktionieren, bei schweren Sachen möchten Sie vielleicht zuerst sehen, ob Sie das Match brauchen oder nicht. Wenn Sie dies nicht tun, verwenden Sie besser die Nicht-Erfassungsgruppe, um mehr Speicher für die Berechnung zuzuweisen, anstatt etwas zu speichern, das Sie niemals verwenden müssen.

Jerry
quelle
Ja, das hatte ich gemerkt. Das Nichterfassen war das, was ich brauchte. Ich dachte, die Verwendung von () würde immer übereinstimmen. Zu wissen, dass es eine Option gibt, die nicht übereinstimmt, ist praktisch. Vielen Dank.
NMGod
Das hast du falsch verstanden. Das ?:Innere einer Gruppierung, auch bekannt als, non-capturingsagt, dass Sie die übereinstimmenden Ausdrücke nicht verwenden können $1, $2und so weiter ... Wenn Sie möchten, dass ein Ausdruck nicht übereinstimmt, benötigen Sie Folgendes ^.
EverythingRightPlace
@ NMGodA1b2c3d4 Gern geschehen! Meinen Sie eine Option, die nicht übereinstimmt oder fängt (es gibt einen Unterschied, ja). Wenn Sie mit keinem dieser (?! ... )Elemente übereinstimmen möchten, verwenden Sie insead, dh (?!s|season)in diesem Fall.
Jerry
126

Verwenden Sie dieses Live-Online-Beispiel, um Ihr Muster zu testen:

Geben Sie hier die Bildbeschreibung ein

Der obige Screenshot stammt aus diesem Live-Beispiel: https://regex101.com/r/cU5lC2/1

Übereinstimmung mit einem ganzen Wort in der Befehlszeile.

Ich werde die interaktive phpsh-Shell unter Ubuntu 12.10 verwenden , um die PCRE-Regex-Engine mit der als preg_match bekannten Methode zu demonstrieren

Starten Sie phpsh, fügen Sie Inhalte in eine Variable ein und stimmen Sie mit dem Wort überein.

el@apollo:~/foo$ phpsh

php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'

php> echo preg_match('(\w+)', $content1);
1

php> echo preg_match('(\w+)', $content2);
1

php> echo preg_match('(\w+)', $content3);
0

Die preg_match Methode verwendet , um den PCRE Motor innerhalb der Sprache PHP Variablen zu analysieren $content1, $content2und $content3mit dem (\w)+Muster.

$ content1 und $ content2 enthalten mindestens ein Wort, $ content3 nicht.

Ordnen Sie ein bestimmtes Wort in der Befehlszeile ohne Wortbountaries zu

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(dart|fart)', $gun1);
1

php> echo preg_match('(dart|fart)', $gun2);
1

php> echo preg_match('(dart|fart)', $gun3);
1

php> echo preg_match('(dart|fart)', $gun4);
0

Variablen gun1und gun2enthalten die Zeichenfolge dartoder fartdie korrekt ist, aber gun3 enthält dartyund stimmt immer noch überein, das ist das Problem. Also weiter zum nächsten Beispiel.

Ordnen Sie bestimmte Wörter in der Befehlszeile den Wortgrenzen zu:

Wortgrenzen können erzwungen werden \b, siehe: Visuelle Analyse der Funktionsweise von wordboundary aus jex.im/regulex

Regex Visual Image von http://jex.im/regulex und https://github.com/JexCheng/regulex Beispiel:

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0

php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0

Es wird \bbehauptet, dass wir eine Wortgrenze haben, um sicherzustellen, dass "Dart" übereinstimmt, "Darty" jedoch nicht.

Eric Leschinski
quelle
3
upvoted, weil ich das \ b char brauchte und es nicht wusste!
Nieminen
Warum ist diese gründliche Erklärung nicht die Antwort?
Dewwwald
1
Weil die Person, die die Frage gestellt hat, die erste Antwort ausgewählt hat, die eingegangen ist, und sich nicht die Mühe gemacht hat, zu meiner zu wechseln, als meine überlegene Antwort später einging. Sie können den Fragesteller per Kommentar unter der Frage bitten, seine Antwortauswahl in diese zu ändern. Dies würde den Wert dieser Seite für Personen verbessern, die darauf landen.
Eric Leschinski
1
Ich habe positiv gestimmt, weil Sie in Ihrem Beispiel das Wort "Furz" verwendet haben ... und ich brauchte das \ w +;)
SomethingOn
Ich benutze regexr.com
Applez00800
4

Ich teste Beispiele in js. Einfachste Lösung - fügen Sie einfach das benötigte Wort in / / hinzu:

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

Nun, wenn Sie dieses spezifische Wort mit Grenzen brauchen, nicht in anderen Zeichen-Buchstaben. Wir verwenden b Marker:

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

Wir haben auch die Methode exec () in js, die das Objektergebnis zurückgibt. Es hilft fg, Informationen über Ort / Index unseres Wortes zu erhalten.

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

Wenn wir alle übereinstimmenden Wörter in Zeichenfolge / Satz / Text erhalten möchten, können wir den Modifikator g (globale Übereinstimmung) verwenden:

"cat good cat good cat".match(/\bcat\b/g).length
// 3 

Nun das letzte - ich brauche nicht ein bestimmtes Wort, aber einige von ihnen. Wir verwenden | Zeichen, es bedeutet Wahl / oder.

"bad dog bad".match(/\bcat|dog\b/g).length
// 1
Vasyl Gutnyk
quelle
2

[ ]definiert eine Zeichenklasse. Also wird jeder Charakter, den Sie dort setzen, übereinstimmen. [012]wird übereinstimmen 0oder 1oder 2und [0-2]verhält sich gleich.

Was Sie wollen, sind Gruppierungen, um eine or-Anweisung zu definieren. Verwenden Sie (s|season)für Ihr Problem.

Übrigens. du musst aufpassen. Metazeichen in normaler Regex (oder innerhalb einer Gruppierung) unterscheiden sich von der Zeichenklasse. Eine Zeichenklasse ist wie eine Subsprache. [$A]wird nur passen $oder Asonst nichts. Kein Entkommen hier für den Dollar.

EverythingRightPlace
quelle