正则表达式:它应匹配以下模式
有效:
((int)10)
-
(int)10
-
((char)((x+y)&1))
-
((int *)1)
无效:
-
(ab)
-
(a&=b)
-
a
-
((a))
(平衡的)带括号的表达式的语言不规则 ,即,您不能编写匹配这些字符串的正则表达式。
请参阅问题: 为什么正则表达式称为“常规”表达式和维基百科:常规语言 。
您需要使用更强大的解析技术,例如使用ANTLR的CFG。
您可以从以下内容开始:
CastedExpression ::= Cast Expression | LPAR CastedExpression RPAR Cast ::= LPAR Type RPAR Expression ::= Sum | Product | Litteral | LPAR Expression RPAR | ... Type ::= char | int | Type ASTERISK | ...
( 如果您发现任何明显的改进,请随意编辑上面的语法)。
这个说法:
(平衡的)带括号的表达式的语言不规则,即,您不能编写匹配这些字符串的正则表达式。
只有在病态forms意义上的经典正则表达式才是真实的。 它不适用于我们许多人每天使用的实际模式。
例如,使用原始有效输入列表中的第三个字符串,此Perl代码:
my $str = "((char)((x+y)&1))"; my $w = length length $str ; my $rx = qr{ (? \( (?: [^()] + | (?&PAREN) ) * \) ) }x; while ($str =~ /(?=$rx)/g) { printf "Matched from %*d to %*d: %s%s\n" => $w => pos($str), $w => pos($str) + length($+{PAREN})-1, " " x pos($str) => $+{PAREN}; }
非常方便地产生以下输出:
Matched from 0 to 16: ((char)((x+y)&1)) Matched from 1 to 6: (char) Matched from 7 to 15: ((x+y)&1) Matched from 8 to 12: (x+y)
我无法分辨出原始的输入集是什么使得一个有效而另一个无效。 不过,我确信我上面给出的代码的详细说明将完美无缺。
但是,您必须在Perl中编写它,因为Java的模式不够强大。 ☹
添加到aioobe的答案:
看起来你正在尝试编写表达式解析器。 正如在另一个答案中已经说过的那样,使用正则表达式是不可能的。 您应该考虑使用表达式解析器(如JEP)或使用javacc自己编写。