solo partita Regex parole intere
-
20-09-2019 - |
Domanda
Ho un'espressione regex che sto usando per trovare tutte le parole in un determinato blocco di contenuti, case insensitive, che sono contenuti in un glossario memorizzata in un database. Ecco il mio modello:
/($word)/i
Il problema è che, se uso /(Foo)/i
poi parole come Food
vengono abbinati. Ci deve essere spazio bianco di confine o una parola su entrambi i lati della parola.
Come posso modificare la mia espressione per abbinare solo la parola Foo
quando si tratta di una parola all'inizio, al centro o fine di una frase?
Soluzione
frontiere utilizzare Word:
/\b($word)\b/i
Se siete alla ricerca di "S.P.E.C.T.R.E." come nell'esempio di Sinan Unur:
/(?:\W|^)(\Q$word\E)(?:\W|$)/i
Altri suggerimenti
Per abbinare qualsiasi parola intera si può usare il modello (\w+)
Supponendo che si sta utilizzando PCRE o qualcosa di simile:
Sopra screenshot preso da questo esempio dal vivo: http://regex101.com/r/cU5lC2
corrispondenza qualsiasi parola intera sulla riga di comando con (\w+)
Sarò utilizzando il phpsh interattivo shell su Ubuntu 12.10 per dimostrare la motore di espressione regolare PCRE attraverso il metodo noto come preg_match
Avvia phpsh, mettere un po 'contenuto in una variabile, partita sulla parola.
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
Il metodo preg_match utilizzato il motore PCRE all'interno del linguaggio PHP per analizzare le variabili: $content1
, $content2
e $content3
con il modello (\w)+
.
$ content1 e $ content2 contengono almeno una parola, $ content3 non lo fa.
corrispondere un numero di parole letterali sulla riga di comando con (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
variabili gun1 e gun2 contengono il dardo stringa o scoreggia. gun4 non lo fa. Tuttavia può essere un problema che cerca di parola fart
partite farty
. Per risolvere questo problema, rispettare i limiti di parola in regex.
corrispondere le parole letterali sulla riga di comando con i confini di parola.
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
Quindi è lo stesso dell'esempio precedente, tranne che la parola fart
con un limite di parola \b
non esiste nel contenuto: farty
.
Utilizzando \b
può produrre risultati sorprendenti. Si sarebbe meglio cercare di capire ciò che separa una parola dalla sua definizione e incorporando le informazioni in vostro modello.
#!/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";
}
Output:
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"
frontiere uso di parola \ b,
I seguenti (utilizzando quattro fughe) lavora nel mio ambiente: Mac, Safari versione 10.0.3 (12602.4.8)
var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
Se si sta facendo in Notepad ++
[\w]+
darebbe l'intera parola, ed è possibile aggiungere le parentesi per farlo come un gruppo. Esempio: conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)
. Vorrei spostare LeakyReLU
nella propria linea come un commento, e sostituire l'attivazione corrente. In Notepad ++ questo può essere fatto utilizzando il comando seguire trovare:
([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)
e il comando di sostituzione diventa:
\1\2'relu'\4 \n # \1 = LeakyReLU\(alpha=a\)\(\1\)
Gli spazi è quello di mantenere la formattazione a destra nel mio codice. :)