Como devo escrever uma regex para corresponder a uma palavra específica?


21

Eu tenho tentado fazer com que um regex específico funcione, mas não consigo fazer o que eu preciso.

Basicamente, quero que procure o ROCKET. O regex deve corresponder ao ROCKET em maiúsculas ou minúsculas e com ou sem pontuação, mas não quando parte de outra palavra. Portanto, o regex seria acionado em qualquer um destes:

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

mas NÃO é acionado no ROCKET quando é encontrado em algo como

Rocketeer
Sprocket

Eu tenho tentado acertar usando um gerador de regex online, mas não consigo fazer a correspondência exata.


11
Essa é uma daquelas situações [pouco frequentes] em que a pergunta pode ser mais adequada para o estouro de pilha. Certifique-se de fornecer um idioma e / ou plataforma, pois cada idioma tem suas próprias peculiaridades. Por exemplo, Windows. .Net e a classe Regex . (Geralmente, é o contrário. O Stack Overflow recebe centenas de perguntas fora do tópico dos desenvolvedores que são mais adequadas para o Superusuário).
— JWW

Respostas:


14

Sugiro que você marque a Referência Rápida de Expressão Regular do MSDN

você deseja obter uma correspondência sem distinção entre maiúsculas e minúsculas para a palavra "foguete" cercada por caracteres não alfanuméricos. Um regex que funcionaria seria:

\W*((?i)rocket(?-i))\W*

O que ele fará é procurar zero ou mais (*) caracteres não alfanuméricos (\ W), seguidos por uma versão sem distinção entre maiúsculas e minúsculas do foguete ((? I) foguete (? - i)), seguido novamente por zero ou mais ( *) caracteres não alfanuméricos (\ W). Os parênteses extras ao redor do termo de correspondência de foguete atribuem a correspondência a um grupo separado. A palavra foguete estará, portanto, no grupo de partida 1.

ATUALIZAÇÃO 1: Matt disse no comentário que esse regex deve ser usado em python. Python tem uma sintaxe um pouco diferente. Para obter o mesmo resultado em python, use este regex e passe a re.IGNORECASEopção para a função compileou match.

\W*(rocket)\W*

No Regex101, isso pode ser simulado digitando "i" na caixa de texto ao lado da entrada do regex.

ATUALIZAÇÃO 2 Ismael mencionou que o regex não está correto, pois pode corresponder a "1rocket1". Ele postou uma solução muito melhor, a saber

(?:^|\W)rocket(?:$|\W)


11
Testar isso com testadores de regex online ( regex101.com, por exemplo) mostra como seqüências de exemplo inválidas e não correspondentes que eu insiro . Isso deve ser usado como parte de um script python. Isso faz alguma diferença na forma como deve ser escrito?
— Kefka

11
sim. você pode ver no regex101.com que pode escolher um "sabor" de regex no canto superior esquerdo, python é um pouco diferente. Vou atualizar minha resposta com o equivalente em python.
— Xaser 18/04

11
Obrigado. Eu pensei que as expressões regulares eram basicamente independentes da linguagem.
— Kefka

11
Deveriam ser, mas existem pequenas diferenças de implementação.
— Xaser 18/04

2
E \W*(rocket)\W*fósforos lrocketl. Deve ser (?:^|\W)(rocket)(?:$|\W)(sem o *e você deve verificar se ele corresponde ao início e / ou final da string).
— Ismael Miguel

10

Acho que o futuro é um exagero nesse caso, e seria melhor usar limites de palavras com a ignorecaseopção

\brocket\b

Em outras palavras, em python:

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I)  # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']

tecnicamente, os grupos que não capturam não são uma busca, mas a opção / b produz exatamente o mesmo resultado que a solução de Ismael, mas pode ser um pouco mais elegante.
— Xaser 19/04

1

Com grepe sed, você pode usar \<rocket\>. Com grepa -iopção fará com que ele case-insensitive ( i gnore caso):

grep -i '\<rocket\>'

Não conheço nenhuma maneira de tornar todas as sedexpressões regulares sem distinção entre maiúsculas e minúsculas, mas sempre há a maneira do homem das cavernas:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'

0

Use a opção Pesquisar somente palavras inteiras.

No que diz respeito às pontuações, você não pode responder até conhecer o sabor / sabor.

É um tópico muito antigo, postado para alguém que possa visitar com uma necessidade posteriormente. Quem originou o segmento pode ter se mudado para outra coisa ... Não?


O que está whole words only optionusando grepou php? Desculpe, mas sua resposta não oferece nenhum valor agregado em comparação com outras respostas.
— Toto
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.