为模式

时间:2017-10-11 04:39:25

标签: regex

我这里的剧本有多个"("和")":

#if( a == b && a == c ) Content 1 #elseif( ( a == b ) && (a != c) ) Content 2 #elseif( (a != b) && (a != c) ) Content 3 #end

我想使用java.util.regex.Pattern来获取此脚本的条件。我想要的结果是:

  • if(a == b&& a == c)

  • elseif((a == b)&&(a!= c))

  • elseif((a!= b)&&(a!= c))

我使用过: 模式模式= Pattern.compile("(#if | #elseif)+(。*?)((([^]]){1,}))"); 但结果并未预料到。请帮我这里的正则表达式。 非常感谢你。

2 个答案:

答案 0 :(得分:1)

不幸的是,Java不支持递归,因此您无法正确匹配平衡的括号组。如果您不希望if / elseif条件之后的部分包含括号,则可以使用以下解决方法:

(?m)^#(?:if|elseif).*? (?!.*[()])(.+)

答案 1 :(得分:1)

试试这个正则表达式:

(?:if|elseif)\s*\((?:[^()]+\)|.*?\)(?:\s*\))+)

Click for Demo

<强>解释

  • (?:if|elseif) - 匹配ifelseif
  • \s* - 匹配0个以上的空白字符
  • [^()]+\) - 匹配任何不是()的字符的1次出现。然后是匹配的)
  • | - 或
  • .*?\)(?:\s*\))+ - 使用嵌套括号()
  • 处理大小写

更新了表达式:

#(?:if|elseif)\s*\((?:[^()]*\)|[^#]+\))