Respuestas:
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), o
y 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.
?:
interior de una agrupación alias non-capturing
simplemente dice que no puede usar las expresiones coincidentes con $1
, $2
y así sucesivamente ... Si desea que una expresión no coincida, lo que necesita es ^
.
(?! ... )
insead, es decir, (?!s|season)
en este caso.
Captura de pantalla anterior tomada de este ejemplo en vivo: https://regex101.com/r/cU5lC2/1
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
, $content2
y $content3
con el (\w)+
patrón.
$ content1 y $ content2 contienen al menos una palabra, $ content3 no.
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 gun1
ygun2
contienen la cadena dart
o fart
cuál es correcta, pero gun3 contiene darty
y aún coincide, ese es el problema. Pasemos al siguiente ejemplo.
Los límites de palabras se pueden combinar a la fuerza con \b
, consulte:
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 \b
afirma que tenemos un límite de palabra, asegurándose de "dardo" es igualada, pero "darty" no lo es.
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
[ ]
define una clase de personaje. Así que todos los personajes que establezcas allí coincidirán. [012]
coincidirá 0
o 1
o 2
y [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.
(season|s)
lugar.[season]
coincide con cualquiera des
,e
,a
,o
,n
.