A chave para documentar a expressão regular é documentá-la. Com demasiada frequência, as pessoas lançam o que parece ser um ruído de linha e o deixam assim.
Dentro de perl , o operador /x
no final da expressão regular suprime os espaços em branco, permitindo que um documente a expressão regular .
A expressão regular acima se tornaria:
$re = qr/
^\s*
(?:
(?:
([\d]+)\s*:\s*
)?
(?:
([\d]+)\s*:\s*
)
)?
([\d]+)
(?:
\s*[.,]\s*([\d]+)
)?
\s*$
/x;
Sim, é um pouco desgastante de espaços em branco verticais, embora se possa encurtá-lo sem sacrificar muita legibilidade.
And then, what the earlier regexp does is this: parse a string of numbers in format 1:2:3.4, capturing each number, where spaces are allowed and only 3 is required.
Olhando para essa expressão regular, é possível ver como ela funciona (e não funciona). Nesse caso, essa regex corresponderá à string 1
.
Abordagens semelhantes podem ser adotadas em outros idiomas. A opção python re.VERBOSE funciona lá.
O Perl6 (o exemplo acima foi para o perl5) leva isso adiante com o conceito das regras , o que leva a ainda mais poderosas estruturas do que o PCRE (ele fornece acesso a outras gramáticas (contexto livre e sensível ao contexto) do que apenas as regulares e regulares regulares).
Em Java (onde este exemplo é extraído), pode-se usar a concatenação de strings para formar o regex.
Pattern re = Pattern.compile(
"^\s*"+
"(?:"+
"(?:"+
"([\d]+)\s*:\s*"+ // Capture group #1
")?"+
"(?:"+
"([\d]+)\s*:\s*"+ // Capture group #2
")"+
")?"+ // First groups match 0 or 1 times
"([\d]+)"+ // Capture group #3
"(?:\s*[.,]\s*([0-9]+))?"+ // Capture group #4 (0 or 1 times)
"\s*$"
);
É verdade que isso cria muito mais "
na string, o que possivelmente causa alguma confusão, pode ser mais facilmente lido (especialmente com realce de sintaxe na maioria dos IDEs) e documentado.
A chave é reconhecer o poder e a natureza "escrever uma vez" que as expressões regulares geralmente entram. Escrever o código para evitar isso defensivamente, de modo que a expressão regular permaneça clara e compreensível, é fundamental. Formamos o código Java para maior clareza - as expressões regulares não são diferentes quando a linguagem oferece a opção de fazê-lo.