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?

War es hilfreich?

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:

eingeben Bild Beschreibung hier

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. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top