Regex java中if-then-else语句的正则表达式
我在为if-then-else语句编写正则表达式时遇到了一些问题。 例如,我有以下字符串(所有字符都在同一行上): 我试着写这个正则表达式,但没有成功:Regex java中if-then-else语句的正则表达式,regex,Regex,我在为if-then-else语句编写正则表达式时遇到了一些问题。 例如,我有以下字符串(所有字符都在同一行上): 我试着写这个正则表达式,但没有成功: if\\s?\\(\\%(.+?)\\%\\)\\s?then (.*?) ((?:else?))*(.*)end if; 在我要捕获的示例中: 组(0):所有字符串; 第(1)组:条件(%codizione1%) 组(2):then和else之间的指令(istruzione1;istruzione1.2;) 第(3)组:第(2)组之后的指令
if\\s?\\(\\%(.+?)\\%\\)\\s?then (.*?) ((?:else?))*(.*)end if;
在我要捕获的示例中:
组(0):所有字符串;
第(1)组:条件(%codizione1%)
组(2):then和else之间的指令(istruzione1;istruzione1.2;)
第(3)组:第(2)组之后的指令的其余部分(else-if(%condizione2%)则为istruzione2;istruzione2.1;istruzione2.2;else-if(%condizione3%)则为istruzione3;end-if;end-if;)
“其他”必须是可选的,我可以有如下内容:
if(%a=b%) then c=d; end if;
请帮帮我。谢谢大家。您的正则表达式几乎是正确的(假设您的意思是
if\s?…
并且您发布的内容是一个Java字符串,其中反斜杠将被转义)。请尝试以下方法:
if\s*\(%(.+?)%\)\s*then\s+(.*?)\s+(?:else\s+(.*)\s*)?end if;
如您所见,我做了一些小改动:
而不是\s*
在\s?
和if
等)之间允许多个空格(
代替单个空格以允许多个(但至少一个)空格\s+
而不是%
,因为\%
不需要转义(参见Andreas的评论)%
而不是(?:else\s+(.*))?
,因为整个块是可选的,从((?:else?))*(.*)
开始。您的版本声明else
是可选的,可以多次找到(使用else
),后面跟着任何(*
)但是你想要的——至少是如何理解它——是可选的*
和else
,因此end if;
(关于最后一个(?:else\s+(.*))?
见Andreas的其他评论)\s*
不过最后要注意的是:请注意,根据语句中允许的内容,表达式可能无法在所有情况下工作。正如我在评论中已经指出的,编程语言通常是不规则的,因此对正则表达式的处理有限制。例如,如果其中一条指令将包含一个带有
“else”
的字符串。您的正则表达式几乎是正确的(假设您的意思是if\s?..
,并且您发布的内容是一个Java字符串,反斜杠将被转义)。请尝试以下方法:
if\s*\(%(.+?)%\)\s*then\s+(.*?)\s+(?:else\s+(.*)\s*)?end if;
如您所见,我做了一些小改动:
而不是\s*
在\s?
和if
等)之间允许多个空格(
代替单个空格以允许多个(但至少一个)空格\s+
而不是%
,因为\%
不需要转义(参见Andreas的评论)%
而不是(?:else\s+(.*))?
,因为整个块是可选的,从((?:else?))*(.*)
开始。您的版本声明else
是可选的,可以多次找到(使用else
),后面跟着任何(*
)但是你想要的——至少是如何理解它——是可选的*
和else
,因此end if;
(关于最后一个(?:else\s+(.*))?
见Andreas的其他评论)\s*
不过最后要注意的是:请注意,根据语句中允许的内容,表达式可能无法在所有情况下工作。正如我在评论中已经指出的,编程语言通常是不规则的,因此对正则表达式的处理有限制。例如,如果其中一条指令将包含一个带有
“else”
的字符串,这是您编写Java字符串的正则表达式还是您编写的标准正则表达式语法,即您的字符串看起来像“if\\s”
还是更像“if\\\\s”
?为什么不使用真正的解析器呢?编程语言通常不是正则的,所以正则表达式很不合适。您编写的正则表达式是Java字符串还是标准正则表达式语法,即字符串看起来像“if\\s”…“
还是更像“if\\\\s”…”
?为什么不改用真正的解析器呢?编程语言通常不是正则的,所以正则表达式很不合适。为什么要转义%
?@Andreas你说得对,我只是从原始表达式复制了它,并没有考虑太多。很好用,请注意,如果使用matches()
然后在第3组上重新应用,第3组以空格结尾,因此您需要it,或者在结尾添加可选的空格匹配模式。谢谢你,托马斯,你救了我的命。我爱你!你为什么要逃避%
?@Andreas你是对的,我只是从原始表达式中复制了它,并没有考虑太多。效果很好,请注意,如果使用匹配()
然后在第3组上重新应用,第3组以空格结尾,因此您需要对其进行修剪()
或者在结尾添加可选的空格匹配图案。谢谢托马斯,您救了我的命。我爱您!