É uma pergunta simples sobre expressões regulares, mas não estou encontrando a resposta.
Quero determinar se um número aparece em sequência exatamente duas ou quatro vezes. Que sintaxe posso usar?
\d{what goes here?}
Tentei \d{2,4}
, mas essa expressão também aceita três dígitos.
abc 123 xyz
? Deve corresponder12
porque são exatamente dois dígitos em sequência? Ou não deveria, porque12
faz parte de uma sequência de dígitos maior123
que não tem 2 nem 4? Se eu tivesse que adivinhar, acho que você deseja o último comportamento, mas sua pergunta não fica clara. Exemplos e / ou uma especificação mais clara ajudariam. Mesma pergunta paraabc 12345 def
... o que deve acontecer lá?Respostas:
Não há sintaxe específica para isso, mas existem várias maneiras de fazer isso:
fonte
\d{2}(?:\d{2})?
solução logo de cara - ótima variedade delas - a última, em particular, parecendo muito boa e escalável.(?:
disso, inicia um "grupo de não captura" (um grupo que não se destina a ser referenciado em uma instrução de substituição). Você também pode usar apenas parênteses, mas eles criarão um grupo de captura. Mais detalhes aqui: stackoverflow.com/questions/3512471/non-capturing-group"333"
. Você pode estar usando a funcionalidade "localizar substring correspondente" da biblioteca regex por engano, em vez da funcionalidade "verificar se a string completa corresponde". Você deve consultar sua documentação.Esta é a maneira correta de fazer isso. A resposta aceita está errada.
Ele corresponderia a 3 dígitos (ou 5). Então, isso está errado aos meus olhos .
1) Verifique se não há nenhum dígito antes de uma sequência de 2 ou 4 dígitos, ou após uma sequência de dois ou quatro dígitos.
(<!)
a sintaxe é negativa para trás(?!)
a sintaxe é antecipação negativa.O anterior funcionaria para mid string:
Se a seqüência de pesquisa não tem conteúdo em torno dele você poderia usar o
^
e$
começar e terminar de âncoras de corda:fonte
(?<!\d)(\d{2}|\d{4})(?!\d)
^\d{4}$|^\d{2}$
seria uma forma potencial de consertar isso. Como faria^\d{2}(?!\d)|^\d{4}(?!\d)