Antworten:
Eckige Klammern sind für die Zeichenklasse gemeint, und Sie versuchen , tatsächlich irgendeine der zum Spiel: s
, |
, s
(wieder), e
, a
, s
(wieder), o
und 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.
?:
Innere einer Gruppierung, auch bekannt als, non-capturing
sagt, dass Sie die übereinstimmenden Ausdrücke nicht verwenden können $1
, $2
und so weiter ... Wenn Sie möchten, dass ein Ausdruck nicht übereinstimmt, benötigen Sie Folgendes ^
.
(?! ... )
Elemente übereinstimmen möchten, verwenden Sie insead, dh (?!s|season)
in diesem Fall.
Der obige Screenshot stammt aus diesem Live-Beispiel: https://regex101.com/r/cU5lC2/1
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
, $content2
und $content3
mit dem (\w)+
Muster.
$ content1 und $ content2 enthalten mindestens ein Wort, $ content3 nicht.
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 gun1
und gun2
enthalten die Zeichenfolge dart
oder fart
die korrekt ist, aber gun3 enthält darty
und stimmt immer noch überein, das ist das Problem. Also weiter zum nächsten Beispiel.
Wortgrenzen können erzwungen werden \b
, siehe:
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 \b
behauptet, dass wir eine Wortgrenze haben, um sicherzustellen, dass "Dart" übereinstimmt, "Darty" jedoch nicht.
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
[ ]
definiert eine Zeichenklasse. Also wird jeder Charakter, den Sie dort setzen, übereinstimmen. [012]
wird übereinstimmen 0
oder 1
oder 2
und [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 A
sonst nichts. Kein Entkommen hier für den Dollar.
(season|s)
stattdessen.[season]
entspricht einems
,e
,a
,o
,n
.