Muitos programadores conhecem a alegria de criar uma expressão regular rápida, hoje em dia com a ajuda de algum serviço da Web, ou mais tradicionalmente em um prompt interativo, ou talvez escrevendo um pequeno script com a expressão regular em desenvolvimento e uma coleção de casos de teste . Em qualquer um dos casos, o processo é iterativo e bastante rápido: continue hackeando a cadeia de aparência enigmática até que ela corresponda e capture o que você deseja e rejeite o que você não deseja.
Para um resultado simples, pode ser algo como isto, como um regexp Java:
Pattern re = Pattern.compile(
"^\\s*(?:(?:([\\d]+)\\s*:\\s*)?(?:([\\d]+)\\s*:\\s*))?([\\d]+)(?:\\s*[.,]\\s*([0-9]+))?\\s*$"
);
Muitos programadores também sabem o que é necessário para editar uma expressão regular ou apenas codificar em torno de uma expressão regular em uma base de código herdada. Com um pouco de edição para dividir, o regexp acima ainda é muito fácil de entender para qualquer pessoa razoavelmente familiarizada com o regexps, e um veterano do regexp deve ver imediatamente o que ele faz (responda no final do post, caso alguém queira fazer o exercício de descobrir por si mesmos).
No entanto, as coisas não precisam ficar muito mais complexo para um regexp para se tornar verdadeiramente coisa, e mesmo com a documentação diligente (que todo mundo só escrevo- claro faz para todos regexps complexos que escrevem ...), modificando as regexps torna-se um tarefa difícil. Também pode ser uma tarefa muito perigosa, se o regexp não for cuidadosamente testado por unidade (mas todos obviamente terão testes de unidade abrangentes para todos os seus regexps complexos, positivos e negativos ...).
Então, para encurtar a história, existe uma solução / alternativa gravação / leitura para expressões regulares sem perder seu poder? Como seria a regexp acima com uma abordagem alternativa? Qualquer idioma é bom, embora uma solução em vários idiomas seja melhor, na medida em que os regexps são em vários idiomas.
E então, o que o regexp anterior faz é o seguinte: analisa uma sequência de números em formato 1:2:3.4
, capturando cada número, onde os espaços são permitidos e somente 3
necessários.