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?

Foi útil?

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:

enter image description here

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. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top