regular - Regex solo coincide con palabras enteras
regex replace online (4)
Tengo una expresión de expresiones regulares que estoy usando para encontrar todas las palabras en un bloque de contenido dado, insensible a mayúsculas y minúsculas, que están contenidas en un glosario almacenado en una base de datos. Aquí está mi patrón:
/($word)/i
El problema es que, si utilizo /(Foo)/i
, las palabras como Food
se emparejan. Es necesario que haya espacios en blanco o un límite de palabras en ambos lados de la palabra.
¿Cómo puedo modificar mi expresión para que coincida solo con la palabra Foo
cuando es una palabra al principio, al medio o al final de una oración?
Para hacer coincidir cualquier palabra completa, usaría el patrón (/w+)
Suponiendo que está utilizando PCRE o algo similar:
Sobre la captura de pantalla tomada de este ejemplo en vivo: http://regex101.com/r/cU5lC2
Coincidencia de cualquier palabra completa en la línea de comandos con (/w+)
Utilizaré el shell interactivo phpsh en Ubuntu 12.10 para demostrar el motor de expresiones regulares PCRE a través del método conocido como preg_match
Inicie phpsh, ponga algo de contenido en una variable, haga coincidir 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 utilizó el motor PCRE dentro del lenguaje PHP para analizar variables: $content1
, $content2
y $content3
con el patrón (/w)+
.
$ content1 y $ content2 contienen al menos una palabra, $ content3 no.
Haga coincidir una cantidad de palabras literales en la línea de 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
las variables gun1 y gun2 contienen el dardo o fart de cuerda. gun4 no. Sin embargo, puede ser un problema que la búsqueda de palabras fart
coincida con farty
. Para solucionar esto, aplique límites de palabras en expresiones regulares.
Combina palabras literales en la línea de comandos con límites de 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 tanto, 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
.
Usa límites de palabras:
//b($word)/b/i
O si está buscando "SPECTRE" como en el ejemplo de Sinan Ünür:
/(?:/W|^)(/Q$word/E)(?:/W|$)/i
Usar /b
puede producir resultados sorprendentes. Sería mejor que averiguas qué separa una palabra de su definición e incorpora esa información en tu 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"
usa límites de palabras / b,
Lo siguiente (usando cuatro escapes) funciona en mi entorno: Mac, Safari Version 10.0.3 (12602.4.8)
var myReg = new RegExp(‘////b’+ variable + ‘////b’, ‘g’)