REGEX nur ganze Wörter entsprechen
-
20-09-2019 - |
Frage
Ich habe einen regulären Ausdruck, dass ich alle die Worte in einem gegebenen Block von Inhalten, Groß- und Kleinschreibung finden bin mit, dass in einem Glossar in einer Datenbank gespeichert enthalten sind. Hier ist mein Muster:
/($word)/i
Das Problem ist, wenn ich /(Foo)/i
dann Worte wie Food
verwenden angepasst bekommen. Es muss Leerzeichen oder eine Wortgrenze auf beiden Seiten des Wortes sein.
Wie kann ich meinen Ausdruck ändere nur das Wort Foo
entsprechen, wenn es ein Wort am Anfang, Mitte oder Ende eines Satzes?
Lösung
Mit Wortgrenzen:
/\b($word)\b/i
Oder wenn Sie die Suche nach „S.P.E.C.T.R.E.“ wie in Sinan Unur dem Beispiel:
/(?:\W|^)(\Q$word\E)(?:\W|$)/i
Andere Tipps
jedes ganzes Wort übereinstimmen würden Sie das Muster verwenden (\w+)
Angenommen, Sie verwenden PCRE oder etwas ähnliches:
Screenshot oben von diesem Live-Beispiel genommen: http://regex101.com/r/cU5lC2
jede ganze Wort Matching auf der Kommandozeile mit (\w+)
Ich werde mit dem phpsh interaktiv Shell auf Ubuntu 12.10 die PCRE Regex-Engine zu demonstrieren durch die Methode bekannt als preg_match
Start phpsh, setzen einige Inhalte in eine Variable, Spiel auf Wort.
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 die PCRE-Engine innerhalb der PHP-Sprachvariablen zu analysieren: $content1
, $content2
und $content3
mit dem (\w)+
Muster.
$ content1 und content2 mindestens ein Wort enthält $, $ Inhalt3 nicht.
eine Reihe von wörtlichen Wörter auf der Kommandozeile passt mit (dart|fart)
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty 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 Furz. gun4 nicht. Allerdings kann es ein Problem sein, dass für Wort fart
suchen farty
entspricht. Um dies zu beheben, Wortgrenzen in regex erzwingen.
Match wörtliche Worte auf der Kommandozeile mit Wortgrenzen.
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty 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
So ist es die gleiche wie im vorherigen Beispiel, außer dass das Wort fart
mit einem \b
Wortgrenze existiert nicht in dem Inhalt: farty
.
\b
Mit überraschenden Ergebnisse. Sie wäre besser dran, herauszufinden, was ein Wort aus seiner Definition trennt und diese Informationen in Ihr Muster enthält.
#!/usr/bin/perl
use strict; use warnings;
use re 'debug';
my $str = 'S.P.E.C.T.R.E. (Special Executive for Counter-intelligence,
Terrorism, Revenge and Extortion) is a fictional global terrorist
organisation';
my $word = 'S.P.E.C.T.R.E.';
if ( $str =~ /\b(\Q$word\E)\b/ ) {
print $1, "\n";
}
Ausgabe:
Compiling REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" Final program: 1: BOUND (2) 2: OPEN1 (4) 4: EXACT (9) 9: CLOSE1 (11) 11: BOUND (12) 12: END (0) anchored "S.P.E.C.T.R.E." at 0 (checking anchored) stclass BOUND minlen 14 Guessing start of match in sv for REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P .E.C.T.R.E. (Special Executive for Counter-intelligence,"... Found anchored substr "S.P.E.C.T.R.E." at offset 0... start_shift: 0 check_at: 0 s: 0 endpos: 1 Does not contradict STCLASS... Guessed: match at offset 0 Matching REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P.E.C.T.R.E. (Special Exec utive for Counter-intelligence,"... 0 | 1:BOUND(2) 0 | 2:OPEN1(4) 0 | 4:EXACT (9) 14 | 9:CLOSE1(11) 14 | 11:BOUND(12) failed... Match failed Freeing REx: "\b(S\.P\.E\.C\.T\.R\.E\.)\b"
Nutzung Wortgrenzen \ b,
Die folgenden (mit vier Fluchten) arbeitet in meiner Umgebung: Mac, Safari Version 10.0.3 (12602.4.8)
var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
Wenn Sie es in Notepad tun ++
[\w]+
Möchten Sie das ganze Wort geben, und Sie können Klammern fügen Sie sie als Gruppe zu erhalten. Beispiel: conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)
. Ich möchte LeakyReLU
in seine eigene Linie als Kommentar bewegen, und die aktuelle Aktivierung ersetzen. In Notepad ++ kann dies mit dem Befehl folgt Fund erfolgen:
([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)
und ersetzen Befehl wird:
\1\2'relu'\4 \n # \1 = LeakyReLU\(alpha=a\)\(\1\)
Die Räume sind, die richtige Formatierung in meinem Code zu halten. :)