Respostas:
Colchetes são voltados para classe de personagem, e você está realmente tentando corresponder a qualquer um dos seguintes: s
, |
, s
(de novo), e
, a
, s
(de novo),o
e n
.
Use parênteses em vez de agrupar:
(s|season)
ou grupo de não captura:
(?:s|season)
Nota: Grupos de não captura informam ao mecanismo que ele não precisa armazenar a correspondência, enquanto o outro (grupo de captura precisa). Para coisas pequenas, ou funciona, para coisas 'pesadas', você pode querer ver primeiro se precisa ou não do fósforo. Caso contrário, é melhor usar o grupo de não captura para alocar mais memória para cálculos em vez de armazenar algo que você nunca precisará usar.
?:
interior de um agrupamento aka non-capturing
apenas diz que você não pode usar as expressões combinadas com $1
, $2
e assim por diante ... Se você quiser que uma expressão não seja correspondida, o que você precisa é ^
.
(?! ... )
insead, ou seja (?!s|season)
, neste caso.
Captura de tela acima tirada deste exemplo ao vivo: https://regex101.com/r/cU5lC2/1
Eu vou estar usando o shell interativo phpsh no Ubuntu 12.10 para demonstrar a motor PCRE regex através do método conhecido como preg_match
Inicie o phpsh, coloque algum conteúdo em uma variável, combine com a palavra.
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
O método preg_match utilizado o motor PCRE dentro da linguagem PHP para analisar variáveis: $content1
, $content2
e $content3
com o(\w)+
padrão.
$ content1 e $ content2 contêm pelo menos uma palavra, $ content3 não.
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
Variáveis gun1
e gun2
contêm a string dart
ou o fart
que está correto, mas gun3 contém darty
e ainda corresponde, esse é o problema. Então, para o próximo exemplo.
Os limites de palavras podem ser forçados a corresponder \b
, consulte:
Imagem visual Regex adquirida de http://jex.im/regulex e https://github.com/JexCheng/regulex Exemplo:
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
O \b
afirma que temos um limite de palavra, garantindo que "dardo" corresponda, mas "dardo" não.
Eu testo exemplos em js. Solução mais simples - basta adicionar a palavra que você precisa dentro de / /:
var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result
Agora, se vc precisar desta palavra específica com limites, não dentro de quaisquer outras letras-signos. Usamos o marcador b :
var reg = /\bcat\b/
reg.test('acatb');//1 test
false // result
reg.test('have cat here');//2 test
true // result
Temos também o método exec () em js, que retorna o resultado do objeto. Ajuda o fg a obter informações sobre o local / índice da nossa palavra.
var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5
Se precisarmos obter todas as palavras correspondentes em string / frase / texto, podemos usar o modificador g (correspondência global):
"cat good cat good cat".match(/\bcat\b/g).length
// 3
Agora o último - não preciso de uma palavra específica, mas de algumas delas. Nós usamos | sinal, significa escolha / ou.
"bad dog bad".match(/\bcat|dog\b/g).length
// 1
[ ]
define uma classe de personagem. Portanto, todos os caracteres que você definir lá serão correspondentes. [012]
corresponderá a 0
ou 1
ou 2
e[0-2]
se comportará da mesma forma.
O que você quer é agrupamentos para definir uma instrução ou. Usar(s|season)
para o seu problema.
Btw. você tem que tomar cuidado. Metacaracteres em regex normal (ou dentro de um agrupamento) são diferentes da classe de caracteres. Uma classe de personagem é como um sub-idioma. [$A]
vai apenas corresponder $
ou A
, nada mais. Não há como escapar aqui pelo dólar.
(season|s)
lugar.[season]
corresponde a qualquer ums
,e
,a
,o
,n
.