正则表达式:它应匹配以下模式

有效:

  1. ((int)10)
  2. (int)10
  3. ((char)((x+y)&1))
  4. ((int *)1)

无效:

  1. (ab)
  2. (a&=b)
  3. a
  4. ((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自己编写。