Expresión regular para coincidir con una palabra o su prefijo

119

Quiero hacer coincidir una expresión regular en una palabra completa.

En el siguiente ejemplo que estoy tratando de igualar so seasonmas lo que tengo partidos s, e, a, oy n.

[s|season]

¿Cómo hago una expresión regular para que coincida con una palabra completa?

NMGod
fuente
4
Úselo en su (season|s)lugar. [season]coincide con cualquiera de s, e, a, o, n.
falsetru

Respuestas:

137

Los corchetes son para clase de caracteres, y que en realidad están tratando de coincidir con uno cualquiera de: s, |, s(de nuevo), e, a, s(de nuevo), oy n.

Use paréntesis en su lugar para agrupar:

(s|season)

o grupo no capturador:

(?:s|season)

Nota: Los grupos de no captura le dicen al motor que no necesita almacenar la coincidencia, mientras que el otro (el grupo de captura sí). Para cosas pequeñas, ya sea que funcione, para cosas 'pesadas', es posible que desee ver primero si necesita la combinación o no. Si no lo hace, mejor use el grupo de no captura para asignar más memoria para el cálculo en lugar de almacenar algo que nunca necesitará usar.

alemán
fuente
Sí, me había dado cuenta de eso. La no captura era lo que necesitaba. Pensé que usar () siempre coincidiría, saber que hay una opción para no coincidir es útil, gracias.
NMGod
Lo entendiste mal. El ?:interior de una agrupación alias non-capturingsimplemente dice que no puede usar las expresiones coincidentes con $1, $2y así sucesivamente ... Si desea que una expresión no coincida, lo que necesita es ^.
EverythingRightPlace
@ NMGodA1b2c3d4 ¡De nada! ¿Te refieres a una opción para no igualar o atrapar (hay una diferencia, sí). Si no desea que coincida con ninguno de estos, utilizará (?! ... )insead, es decir, (?!s|season)en este caso.
Jerry
126

Utilice este ejemplo en vivo en línea para probar su patrón:

ingrese la descripción de la imagen aquí

Captura de pantalla anterior tomada de este ejemplo en vivo: https://regex101.com/r/cU5lC2/1

Coincidir con cualquier palabra completa en la línea de comandos.

Voy a estar utilizando el shell interactivo phpsh en Ubuntu 12.10 para demostrar el motor PCRE expresión regular a través del método conocido como preg_match

Inicie phpsh, ponga algo de contenido en una variable, coincida con la 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 utiliza el motor preg_match PCRE dentro del lenguaje PHP para analizar las variables: $content1, $content2y $content3con el (\w)+patrón.

$ content1 y $ content2 contienen al menos una palabra, $ content3 no.

Coincidir con palabras específicas en la línea de comandos sin límites de palabras

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty 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 gun1ygun2 contienen la cadena darto fartcuál es correcta, pero gun3 contiene dartyy aún coincide, ese es el problema. Pasemos al siguiente ejemplo.

Haga coincidir palabras específicas en la línea de comandos con límites de palabras:

Los límites de palabras se pueden combinar a la fuerza con \b , consulte: Análisis visual de lo que hace Wordboundary de jex.im/regulex

Imagen visual Regex adquirida de http://jex.im/regulex y https://github.com/JexCheng/regulex Ejemplo:

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty 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

El \bafirma que tenemos un límite de palabra, asegurándose de "dardo" es igualada, pero "darty" no lo es.

Eric Leschinski
fuente
3
votó a favor porque necesitaba el carácter \ b y no lo sabía.
Nieminen
¿Por qué esta explicación detallada no es la respuesta?
dewwwald
1
Porque la persona que publicó la pregunta seleccionó la primera respuesta que recibió, y no se molestó en cambiar a la mía cuando mi respuesta inmensamente superior llegó más tarde. Puede pedirle al interrogador a través de un comentario debajo de la pregunta que cambie su selección de respuesta a esta, y mejoraría el valor de esta página para las personas que acceden a ella.
Eric Leschinski
1
Elegí mi voto porque usaste la palabra "pedo" en tu ejemplo ... y necesitaba el \ w +;)
SomethingOn
Uso regexr.com
Applez00800
4

Pruebo ejemplos en js. La solución más simple: solo agregue la palabra que necesita dentro / /:

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

Ahora, si necesita esta palabra específica con límites, no dentro de ningún otro signo-letra. Usamos el marcador b :

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

También tenemos el método exec () en js, que devuelve object-result. Ayuda a fg a obtener información sobre el lugar / índice de nuestra palabra.

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

Si necesitamos obtener todas las palabras coincidentes en una cadena / oración / texto, podemos usar el modificador g (coincidencia global):

"cat good cat good cat".match(/\bcat\b/g).length
// 3 

Ahora el último: no necesito una palabra específica, sino algunas de ellas. Usamos | signo, significa elección / o.

"bad dog bad".match(/\bcat|dog\b/g).length
// 1
Vasyl Gutnyk
fuente
2

[ ]define una clase de personaje. Así que todos los personajes que establezcas allí coincidirán. [012]coincidirá 0o 1o 2y [0-2]se comporta de la misma.

Lo que desea son agrupaciones para definir una declaración o. Utilizar(s|season) para su problema.

Por cierto. tienes que tener cuidado. Los metacaracteres en expresiones regulares normales (o dentro de una agrupación) son diferentes de la clase de carácter. Una clase de personaje es como un sub-lenguaje. [$A]solo coincidirá $o A, nada más. No hay escapatoria aquí por el dólar.

EverythingRightPlace
fuente