Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex java中if-then-else语句的正则表达式_Regex - Fatal编程技术网

Regex java中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-then-else语句编写正则表达式时遇到了一些问题。 例如,我有以下字符串(所有字符都在同一行上):

我试着写这个正则表达式,但没有成功:

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+(.*))?
    (关于最后一个
    \s*
    见Andreas的其他评论)

不过最后要注意的是:请注意,根据语句中允许的内容,表达式可能无法在所有情况下工作。正如我在评论中已经指出的,编程语言通常是不规则的,因此对正则表达式的处理有限制。例如,如果其中一条指令将包含一个带有
“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+(.*))?
    (关于最后一个
    \s*
    见Andreas的其他评论)

不过最后要注意的是:请注意,根据语句中允许的内容,表达式可能无法在所有情况下工作。正如我在评论中已经指出的,编程语言通常是不规则的,因此对正则表达式的处理有限制。例如,如果其中一条指令将包含一个带有
“else”

的字符串,这是您编写Java字符串的正则表达式还是您编写的标准正则表达式语法,即您的字符串看起来像
“if\\s”
还是更像
“if\\\\s”
?为什么不使用真正的解析器呢?编程语言通常不是正则的,所以正则表达式很不合适。您编写的正则表达式是Java字符串还是标准正则表达式语法,即字符串看起来像
“if\\s”…“
还是更像
“if\\\\s”…”
?为什么不改用真正的解析器呢?编程语言通常不是正则的,所以正则表达式很不合适。为什么要转义
%
?@Andreas你说得对,我只是从原始表达式复制了它,并没有考虑太多。很好用,请注意,如果使用
matches()
然后在第3组上重新应用,第3组以空格结尾,因此您需要it,或者在结尾添加可选的空格匹配模式。谢谢你,托马斯,你救了我的命。我爱你!你为什么要逃避
%
?@Andreas你是对的,我只是从原始表达式中复制了它,并没有考虑太多。效果很好,请注意,如果使用
匹配()
然后在第3组上重新应用,第3组以空格结尾,因此您需要对其进行
修剪()
或者在结尾添加可选的空格匹配图案。谢谢托马斯,您救了我的命。我爱您!