Eu tenho uma lista de strings. Alguns deles são da forma 123-...456
. A porção variável "..." pode ser:
- a string "apple" seguida de um hífen, por exemplo
123-apple-456
- a cadeia "banana" seguida de um hífen, por exemplo
123-banana-456
- uma string em branco, por exemplo
123-456
(observe que há apenas um hífen)
Qualquer palavra que não seja "maçã" ou "banana" é inválida.
Para esses três casos, eu gostaria de combinar "maçã", "banana" e "", respectivamente. Observe que eu nunca quero capturar o hífen, mas sempre quero combiná- lo. Se a sequência não tiver a forma 123-...456
descrita acima, não haverá correspondência.
Como escrevo uma expressão regular para fazer isso? Suponha que eu tenha um sabor que permita grupos de olhar para trás, olhar para trás, olhar em volta e não capturar.
A observação principal aqui é que, quando você tem "maçã" ou "banana", também deve ter o hífen à direita, mas não deseja correspondê-lo. E quando você estiver combinando a sequência em branco, não deverá ter o hífen à direita. Um regex que encapsula essa afirmação será o correto, eu acho.
Respostas:
A única maneira de não capturar algo é usando asserções :
Porque, mesmo em grupos que não capturam,
(?:…)
a expressão regular inteira captura o conteúdo correspondente. Mas essa expressão regular corresponde apenasapple
oubanana
se é precedida por123-
e seguida por-456
, ou corresponde à string vazia se for precedida por123-
e seguida por456
.fonte
Atualização: Obrigado a Germán Rodríguez Herrera!
Em javascript tente:
/123-(apple(?=-)|banana(?=-)|(?!-))-?456/
Lembre-se de que o resultado está no grupo 1
Demo de depuração
fonte
Experimentar:
Isso corresponderá a
apple
,banana
ou uma sequência em branco e, a seguir, haverá um 0 ou 1 hífen. Eu estava errado em não ter necessidade de um grupo de captura. Parvo eu.fonte
Modifiquei uma das respostas (por @ op1ekun):
O motivo é que a resposta de @ op1ekun também corresponde
"123-apple456"
, sem o hífen após a maçã.fonte
Tente o seguinte:
fonte
apple
oubanana
ou "". Todos os outros valores são inválidos, como afirmei.Uma variação da expressão do @Gumbo que é usada
\K
para redefinir as posições de correspondência para impedir a inclusão de blocos numéricos na correspondência. Utilizável nos sabores PCRE regex.Partidas:
fonte
De longe, o mais simples (funciona para python) é
'123-(apple|banana)-?456'
.fonte
123-apple456
portanto, não está correto.