Regex: Special Backtracking Control Verbs

"Special Backtracking Control Verbs" é o recurso introduzido no Perl 5.10, já suportado pela PCRE, embora não totalmente fidedigno. Recentemente encontrei um uso para um desses Control verbs, a situação é a seguinte: Casar o bloco do IF e se houver o ELSE também, mas com uma condição, o bloco do ELSE deverá estar em branco.

Tendo uma string:

if (1) {
 
} else {
	foo;	
}

Se tão somente utilizarmos a seguinte regex, apagando a parte que casar:

/
if\s*\(1\)\s*\{
	[^}]+
\}
(?:\s*else\s*\{
	\s*
\})?
/x

Nós teremos a sintaxe quebrada, ou seja:

 else {
	foo;	
}

Isso por causa do backtracking. Que fará voltar ao início do bloco do ELSE quando notar que não poderá casá-lo da forma que especifiquei (bloco em branco).

Apesar de ter outra forma de resolver isso, como:

/
if\s*\(1\)\s*\{
	[^}]+
\}
(?(?=\s*else\s*\{)
	(?:\s*else\s*\{
		\s*
	\})
)
/x

Usando o control verb (*COMMIT), asseguramos que quando a engine não encontrar o que vier após ele, não poderá fazer backtracking para antes da posição onde ele for encontrado. Que é a situação do bloco do ELSE.

Então simplesmente teremos:

/
if\s*\(1\)\s*\{
	[^}]+
\}
(?:\s*else\s*\{
	(*COMMIT)\s*
\})?
/x

Simples assim! Há vários outros control verbs, no Perl vemos alguns suportando até mesmo parâmetros. Todavia a PCRE não suporta parametrizado, mas já dá para utilizá-los em casos como este. :)

Mais informações? Consulte: http://pcre.org/man.txt

Eu comecei a não entender a

Eu comecei a não entender a partir de "Nós teremos a sintaxe quebrada, ou seja:".

Mas tudo bem, agora eu já sei: fidedigno adj. Digno de todo o crédito.

:)

Opa! O problema ali seria o

Opa!

O problema ali seria o bendito (?:\s*else\s*\{\s*\})"?", certo?

ps. agora eu também sei o que é: fidedigno adj. Digno de todo o crédito.

Exatamente, o '?' é o

Exatamente, o '?' é o problema em questão.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options