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?

¿Fue útil?

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:

introducir descripción de la imagen aquí

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top