2015-04-18 17:16:31 +0000 2015-04-18 17:16:31 +0000
20
20
Advertisement

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

Advertisement

Tenho tentado pôr um regex específico a funcionar, mas não consigo que faça o que preciso.

Basicamente, quero que ele procure o ROCKET. O regex deve corresponder ao ROCKET em caixas superiores ou inferiores, com ou sem pontuação, mas não quando faz parte de outra palavra. Por isso, o regex deve ser activado em qualquer um destes:

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

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

Rocketeer
Sprocket

Tenho tentado acertar usando um gerador regex online mas não consigo que corresponda exactamente.

Advertisement
Advertisement

Respostas (4)

11
11
11
2015-04-18 17:32:40 +0000

Sugiro que marque o MSDN Regular Expression Quick Reference

que pretende obter uma correspondência insensível a maiúsculas e minúsculas para a palavra “foguete” rodeado de caracteres não alfanuméricos. Um regex que funcionaria seria:

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

O que fará é procurar por zero ou mais (*) caracteres não alfanuméricos (\W), seguido por uma versão insensível a maiúsculas e minúsculas (?i)rocket(?-i) ), seguido novamente por zero ou mais (*) caracteres não alfanuméricos (\W). Os parênteses extra em torno do termo “foguete” atribuem a correspondência a um grupo separado. A palavra foguetão estará assim no grupo de partida 1.

UPDATE 1: Matt disse no comentário que este regex deve ser usado em python. Python tem uma sintaxe ligeiramente diferente. Para obter o mesmo resultado em python, utilize este regex e passe a opção re.IGNORECASE para a função compile ou match.

\W*(rocket)\W*

Em Regex101 isto pode ser simulado introduzindo “i” na caixa de texto junto à entrada do regex.

UPDATE 2 Ismael mencionou, que o regex não é totalmente correcto, uma vez que pode corresponder a “1rocket1”. Ele postou uma solução muito melhor, nomeadamente

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

10
10
10
2015-04-19 06:17:43 +0000

Penso que, neste caso, a aparência é exagerada, e seria melhor usar limites de palavras com a opção ignorecase,

\brocket\b

Por 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']
1
Advertisement
1
1
2015-04-19 04:00:42 +0000
Advertisement

Com grep e sed, pode usar \<rocket\>.  Com grep, a opção -i fará com que não seja sensível a maiúsculas e minúsculas ( i mala gnore):

grep -i '\<rocket\>'

Não sei como fazer com que todos os sed não sejam sensíveis a maiúsculas e minúsculas, mas há sempre a opção

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'
0
0
0
2019-11-23 10:06:05 +0000

Use a opção Procurar apenas por palavras inteiras.

No que respeita a pontuação, não pode responder até conhecer o sabor.

É um tópico muito antigo, por isso afixado para alguém que possa visitar com uma necessidade, mais tarde. Quem originou o fio pode ter mudado para outra coisa… Não?

Advertisement

Questões relacionadas

3
6
12
4
5
Advertisement
Advertisement