java中if-then-else语句的正则表达式

时间:2017-07-10 14:30:57

标签: regex

我在编写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;

请帮帮我。谢谢你们。

1 个答案:

答案 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是可选的,可以多次找到(使用*),后跟任何内容(.*)。但是你想要的 - 至少是如何理解它 - 是可选的elseend if;之间的所有内容,因此(?:else\s+(.*)\s*)?(关于最后\s*看到安德烈亚斯的其他评论)。

最后要注意的是:请注意,根据语句中允许的内容,表达式可能在所有情况下都不起作用。正如我在评论中已经说过的那样,编程语言通常是不规则的,因此对正则表达式的处理方式有限制。例如,如果其中一条指令的条件包含"else "字符串,则可能会出现问题。