Sólo los partidos enteros de expresiones regulares palabras
-
20-09-2019 - |
Pregunta
Tengo una expresión de expresiones regulares que estoy usando para encontrar todas las palabras en un bloque dado de contenidos, entre mayúsculas y minúsculas, que están contenidos en un glosario almacenada en una base de datos. Aquí está mi patrón:
/($word)/i
El problema es, si uso /(Foo)/i
entonces palabras como Food
quedar emparejados. Es necesario que haya límite de espacio en blanco o una palabra en ambos lados de la palabra.
¿Cómo puedo modificar mi expresión para que coincida con sólo la palabra Foo
cuando es una palabra al principio, en medio o al final de una frase?
Solución
fronteras uso de palabras:
/\b($word)\b/i
O si usted está en busca de "S.P.E.C.T.R.E." al igual que en el ejemplo de Sinan Unur:
/(?:\W|^)(\Q$word\E)(?:\W|$)/i
Otros consejos
Para analizar cualquier palabra completa se usaría el (\w+)
patrón
Si se asume que está utilizando PCRE o algo similar:
Por encima de captura de pantalla tomada de este ejemplo vivo: http://regex101.com/r/cU5lC2
Cualquiera de las Palabras en toda la línea de comandos con (\w+)
Yo estaré utilizando el phpsh cáscara interactiva en Ubuntu 12.10 para demostrar la motor de expresiones regulares PCRE a través del método conocido como preg_match
Iniciar phpsh, poner un poco de contenido en una variable, partido en palabra.
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
El método preg_match utiliza el motor PCRE dentro del lenguaje PHP para analizar las variables: $content1
, $content2
y $content3
con el patrón (\w)+
.
$ Content1 y $ Content2 contienen al menos una palabra, $ content3 no.
Coinciden con un número de palabras literales de la línea de comandos 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
variables de gun1 y gun2 contienen el dardo cuerda o pedo. GUN4 no lo hace. Sin embargo, puede ser un problema que busca fart
palabra coincide farty
. Para solucionar este problema, hacer cumplir los límites de palabra en expresiones regulares.
coincidir palabras literales de la línea de comandos con los límites de las palabras.
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
Por lo que es lo mismo que el ejemplo anterior, excepto que la palabra fart
con un límite de palabra \b
no existe en el contenido: farty
.
Uso \b
puede producir resultados sorprendentes. Usted sería mejor averiguar lo que separa una palabra de su definición e incorporar esa información en su patrón.
#!/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";
}
Salida:
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"
fronteras uso de palabras \ b,
Las siguientes (utilizando cuatro escapes) trabaja en mi entorno: Mac, Safari versión 10.0.3 (12602.4.8)
var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
Si usted lo está haciendo en Notepad ++
[\w]+
le daría la palabra completa, y se puede añadir paréntesis para conseguirlo como grupo. Ejemplo: conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)
. Me gustaría pasar LeakyReLU
en su propia línea como un comentario, y sustituir la activación actual. En Notepad ++ esto se puede hacer usando el comando siga encontrar:
([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)
y el comando reemplazar convierte en:
\1\2'relu'\4 \n # \1 = LeakyReLU\(alpha=a\)\(\1\)
Los espacios es mantener el formato correcto en mi código. :)