Regex stimmen nur mit ganzen Wörtern überein


89

Ich habe einen regulären Ausdruck, mit dem ich alle Wörter in einem bestimmten Inhaltsblock finde, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird und die in einem in einer Datenbank gespeicherten Glossar enthalten sind. Hier ist mein Muster:

/($word)/i

Das Problem ist, wenn ich /(Foo)/idann Wörter wie Foodget übereinstimmen. Auf beiden Seiten des Wortes muss ein Leerzeichen oder eine Wortgrenze vorhanden sein.

Wie kann ich meinen Ausdruck so ändern, dass er nur mit dem Wort übereinstimmt, Foowenn es sich um ein Wort am Anfang, in der Mitte oder am Ende eines Satzes handelt?

Antworten:


118

Verwenden Sie Wortgrenzen:

/\b($word)\b/i

Oder wenn Sie nach "SPECTRE" suchen, wie im Beispiel von Sinan Ünür:

/(?:\W|^)(\Q$word\E)(?:\W|$)/i

1
Ich habe gerade die Langversion dieser Antwort geschrieben, als Sie gepostet haben. :)
ZombieSheep

@ RichardSimoes \b(<|>=)\bpasst nicht zusammen>=
alhelal

@RichardSimoes und \b[-|+][0-9]+\bMatch +10in 43E+10. Beides will ich nicht.
Alhelal

Was ist, wenn ich ein Wort suchen möchte, das nicht angehängt ist oder in keinem anderen Wort enthalten ist? dann wird diese Logik nicht funktionieren
Prasanna Sasne

Wie würde jemand die mathematischen Vergleichsoperatoren> = und <= bekommen?
AntonSack

48

Um ein ganzes Wort zu finden, würden Sie das Muster verwenden (\w+)

Angenommen, Sie verwenden PCRE oder ähnliches:

Geben Sie hier die Bildbeschreibung ein

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

Abgleichen eines ganzen Wortes in der Befehlszeile mit (\w+)

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 eine Reihe von wörtlichen Wörtern in der Befehlszeile zu (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

Die Variablen gun1 und gun2 enthalten den String Dart oder Fart. gun4 nicht. Allerdings kann es ein Problem sein , dass für Wort sucht fartStreichhölzer farty. Um dies zu beheben, erzwingen Sie Wortgrenzen in Regex.

Ordnen Sie wörtliche Wörter in der Befehlszeile den Wortgrenzen zu.

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

Es ist also dasselbe wie im vorherigen Beispiel, außer dass das Wort fartmit einer \bWortgrenze im Inhalt nicht vorhanden ist : farty.


bin, Uhr sind keine Worte?
Diener

Wenn Sie am und pm als Wörter erzwingen möchten (sie sind keine Akronyme), fügen Sie einen Punkt als Wortzeichen für Ihre Regex-Engine hinzu. Für Sie scheint es, dass Sie den Punkt nicht als Wortzeichen festgelegt haben, daher werden Regex-Wörter für die Standarddefinition von "Wort", die Sie in Ihrem Europäischen Wörterbuch für Ihren hybriden Europäer gelernt haben, nicht eins zu eins und weiter sein Sprache (oder eine andere Sprache für diese Angelegenheit).
Eric Leschinski

8

Die Verwendung \bkann zu überraschenden Ergebnissen führen. Sie sollten besser herausfinden, was ein Wort von seiner Definition unterscheidet, und diese Informationen in Ihr Muster integrieren.

#!/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:

Kompilieren von REx "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B"
Abschlussprogramm:
   1: GEBUNDEN (2)
   2: OPEN1 (4)
   4: GENAU (9)
   9: CLOSE1 (11)
  11: GEBUNDEN (12)
  12: ENDE (0)
verankert "SPECTER" bei 0 (Überprüfung verankert) Klasse BOUND minlen 14
Erraten des Matchbeginns in sv für REx "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B" gegen "SP
.ECTRE (Special Executive for Counter-Intelligence, "...
Verankertes Substrat "SPECTER" bei Offset 0 gefunden ...
start_shift: 0 check_at: 0 s: 0 endpos: 1
Widerspricht nicht STCLASS ...
Erraten: Übereinstimmung bei Offset 0
Abgleichen von REx "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B" mit "SPECTER (Special Exec
für Gegenspionage, "...
   0 | 1: GEBUNDEN (2)
   0 | 2: OPEN1 (4)
   0 | 4: GENAU (9)
  14 | 9: CLOSE1 (11)
  14 | 11: GEBUNDEN (12)
                                  gescheitert...
Übereinstimmung fehlgeschlagen
REx freigeben: "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B"

1
Ich denke, ein Wort wird normalerweise ein \ w Wort sein, aber ein interessanter Punkt.
Richard Simões

1

benutze Wortgrenzen \ b,

Folgendes funktioniert (mit vier Escapezeichen) in meiner Umgebung: Mac, Safari Version 10.0.3 (12602.4.8)

var myReg = new RegExp(‘\\\\b’+ variable + \\\\b’, g’)

1

Für diejenigen, die eine Aufzählung in ihrem Code validieren möchten, können Sie der Anleitung folgen

In Regex World können Sie ^eine Zeichenfolge starten und $beenden. Die Verwendung in Kombination mit |könnte das sein, was Sie wollen:

^(Male)$|^(Female)$

Es wird nur für Maleoder Femalecase true zurückgegeben .


^und $stimmen mit dem Anfang (bzw. dem Ende) einer Zeile überein, daher würde Ihr Beispiel nur übereinstimmen , wenn dies die einzigen Wörter in der Zeile sind.
Gented

und genau das will ich, wenn ich eine enum validieren will! Was ist das Problem?
MohamadrezaRahimianGolkhandani

0

Wenn Sie es in Notepad ++ tun

[\w]+ 

Würde Ihnen das gesamte Wort geben, und Sie können Klammern hinzufügen, um es als Gruppe zu erhalten. Beispiel : conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs). Ich möchte LeakyReLUals Kommentar in eine eigene Zeile wechseln und die aktuelle Aktivierung ersetzen. In Notepad ++ kann dies mit dem folgenden Befehl find find erfolgen:

([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)

und der Ersetzungsbefehl wird:

\1\2'relu'\4 \n    # \1 = LeakyReLU\(alpha=a\)\(\1\)

Die Leerzeichen sollen die richtige Formatierung in meinem Code beibehalten. :) :)


-1

Holen Sie sich alle "Wörter" in einer Zeichenfolge

/([^\s]+)/g

Bedeutet im Grunde ^/s, auf Leerzeichen zu brechen (oder Gruppen von Nicht-Leerzeichen abzugleichen).
Vergessen Sie das nicht gfür Gierig

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.