我在编写if-then-else语句的正则表达式时遇到了一些问题。 例如,我有以下字符串(所有char都在同一行):
if(%codizione1%) then istruzione1; istruzione1.2; else if(%condizione2%) then istruzione2; istruzione 2.1; istruzione 2.2; else if(%condizione3%) then istruzione3; end if; end if; end if;
我试着写这个正则表达式,但它没有工作:
if\\s?\\(\\%(.+?)\\%\\)\\s?then (.*?) ((?:else?))*(.*)end if;
在我要捕获的示例中: group(0):所有字符串; 组(1):条件(%codizione1%) group(2):then和else之间的指令(istruzione1; istruzione1.2;) 组(3):组(2)之后的其余指令(否则如果(%condizione2%)则istruzione2; istruzione 2.1; istruzione 2.2;否则如果(%condizione3%)则istruzione3;结束if;结束if;)< / p>
else必须是可选的,我可以有类似的东西:
if(%a=b%) then c=d; end if;
请帮帮我。谢谢你们。
答案 0 :(得分:4)
您的正则表达式几乎是正确的(假设您的意思是if\s?...
,而您发布的内容是Java字符串的内容,其中反斜杠将被转义)。请尝试以下方法:
if\s*\(%(.+?)%\)\s*then\s+(.*?)\s+(?:else\s+(.*)\s*)?end if;
正如您所看到的,我做了一些小改动:
\s*
而不是\s?
允许在if
和(
等之间留出多个空格。\s+
而不是单个空格,以允许多个(但至少一个)%
代替\%
,因为%
不需要转义(参见Andreas的评论)(?:else\s+(.*)\s*)?
代替((?:else?))*(.*)
,因为整个块都是可选的,从else
开始。您的版本声明else
是可选的,可以多次找到(使用*
),后跟任何内容(.*
)。但是你想要的 - 至少是如何理解它 - 是可选的else
和end if;
之间的所有内容,因此(?:else\s+(.*)\s*)?
(关于最后\s*
看到安德烈亚斯的其他评论)。 最后要注意的是:请注意,根据语句中允许的内容,表达式可能在所有情况下都不起作用。正如我在评论中已经说过的那样,编程语言通常是不规则的,因此对正则表达式的处理方式有限制。例如,如果其中一条指令的条件包含"else "
字符串,则可能会出现问题。