Regex corresponder apenas palavras inteiras
-
20-09-2019 - |
Pergunta
Eu tenho uma expressão regex que eu estou usando para encontrar todas as palavras de um determinado bloco de conteúdo, não diferencia maiúsculas de minúsculas, que estão contidos em um glossário armazenados em um banco de dados.Aqui está o meu padrão:
/($word)/i
O problema é, se eu usar /(Foo)/i
em seguida, palavras como Food
obter correspondente.Deve haver espaço em branco ou um limite de palavra em ambos os lados da palavra.
Como posso modificar a minha expressão, para corresponder apenas a palavra Foo
quando se trata de uma palavra no início, meio ou fim de uma frase?
Solução
Use os limites das palavras:
/\b($word)\b/i
Ou se você estiver procurando por "Spectre", como no exemplo de Sinan ünür:
/(?:\W|^)(\Q$word\E)(?:\W|$)/i
Outras dicas
Para corresponder qualquer palavra que você usaria o padrão (\w+)
Assumindo que você está usando LINUX ou algo semelhante:
Imagem acima tomadas a partir deste exemplo vivo: http://regex101.com/r/cU5lC2
A correspondência de qualquer palavra inteira na linha de comando com o (\w+)
Eu vou estar usando o phpsh shell interativo no Ubuntu 12.10 para demonstrar o PCRE mecanismo de regex através do método conhecido como preg_match
Iniciar phpsh, coloque um pouco de conteúdo em uma variável, corresponde no word.
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 preg_match método utilizado na HRVATSKOM motor dentro da linguagem PHP para analisar variáveis: $content1
, $content2
e $content3
com o (\w)+
o padrão.
$content1 e $content2 conter pelo menos uma palavra, $content3 não.
Corresponder uma série de palavras literais na linha de comando com o (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
variáveis gun1 e gun2 contêm a seqüência de caracteres de dardo ou de peido.gun4 não.No entanto, ele pode ser um problema que olhando para o word fart
jogos farty
.Para corrigir isso, impor limites da palavra de regex.
A correspondência literal de palavras na linha de comando com os limites da palavra.
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
Então, é a mesma do exemplo anterior, exceto que a palavra fart
com um \b
limite de palavra não existe no conteúdo: farty
.
Usando \b
pode produzir resultados surpreendentes. É melhor você descobrir o que separa uma palavra de sua definição e incorporando essas informações em seu padrão.
#!/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";
}
Resultado:
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"
Use limites de palavras b,
O seguinte (usando quatro fugas) funciona no meu ambiente: Mac, Safari versão 10.0.3 (12602.4.8)
var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
Se você está fazendo isso no bloco de notas ++
[\w]+
Daria a você a palavra inteira e você pode adicionar parênteses para obtê -la como um grupo. Exemplo: conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)
. Eu gostaria de me mudar LeakyReLU
em sua própria linha como um comentário e substitua a ativação atual. No bloco de notas ++, isso pode ser feito usando o comando siga e encontre:
([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)
e o comando de substituição se torna:
\1\2'relu'\4 \n # \1 = LeakyReLU\(alpha=a\)\(\1\)
Os espaços são manter a formatação certa no meu código. :)