Expressão regular para corresponder a uma palavra ou seu prefixo

119

Quero combinar uma expressão regular em uma palavra inteira.

No exemplo a seguir Eu estou tentando corresponder sou seasonmas o que tenho partidas s, e, a, oe n.

[s|season]

Como faço uma expressão regular para corresponder a uma palavra inteira?

NMGod
fonte
4
Use em seu (season|s)lugar. [season]corresponde a qualquer um s, e, a, o, n.
falsetru

Respostas:

137

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.

Jerry
fonte
Sim, eu tinha percebido isso. A não captura era o que eu precisava. Achei que usar () sempre corresponderia, saber que há uma opção de não correspondência é útil, obrigado.
NMGod
Você não entendeu isso. O ?:interior de um agrupamento aka non-capturingapenas diz que você não pode usar as expressões combinadas com $1, $2e assim por diante ... Se você quiser que uma expressão não seja correspondida, o que você precisa é ^.
EverythingRightPlace
@ NMGodA1b2c3d4 De nada! Você quer dizer uma opção de não combinar ou pegar (há uma diferença, sim). Se você não quiser corresponder a nenhum desses, usará (?! ... )insead, ou seja (?!s|season), neste caso.
Jerry
126

Use este exemplo online ao vivo para testar seu padrão:

insira a descrição da imagem aqui

Captura de tela acima tirada deste exemplo ao vivo: https://regex101.com/r/cU5lC2/1

Combinando qualquer palavra inteira na linha de comando.

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, $content2e $content3com o(\w)+ padrão.

$ content1 e $ content2 contêm pelo menos uma palavra, $ content3 não.

Corresponde a palavras específicas na linha de comando sem recompensas de palavras

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 gun1e gun2contêm a string dartou o fartque está correto, mas gun3 contém dartye ainda corresponde, esse é o problema. Então, para o próximo exemplo.

Combine palavras específicas na linha de comando com limites de palavras:

Os limites de palavras podem ser forçados a corresponder \b, consulte: Análise visual do que o limite de palavras está fazendo em jex.im/regulex

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 \bafirma que temos um limite de palavra, garantindo que "dardo" corresponda, mas "dardo" não.

Eric Leschinski
fonte
3
votei positivamente porque eu precisava do \ b char e não sabia disso!
Nieminen
Por que essa explicação completa não é a resposta?
dewwwald
1
Porque a pessoa que postou a pergunta selecionou a primeira resposta que veio e não se preocupou em mudar para a minha quando minha resposta amplamente superior veio depois. Você pode pedir ao questionador por meio de um comentário sob a pergunta para alterar sua seleção de respostas para esta, e isso aumentaria o valor desta página para as pessoas que acessarem.
Eric Leschinski
1
Eu votei porque você usou a palavra "peido" em seu exemplo ... e eu precisava do \ w +;)
SomethingOn
Eu uso regexr.com
Applez00800
4

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
Vasyl Gutnyk
fonte
2

[ ]define uma classe de personagem. Portanto, todos os caracteres que você definir lá serão correspondentes. [012]corresponderá a 0ou 1ou 2e[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.

EverythingRightPlace
fonte