有效:
((int)10)
(int)10
((char)((x+y)&1))
((int *)1)
无效:
(a-b)
(a&=b)
a
((a))
答案 0 :(得分:8)
(平衡的)带括号的表达式的语言是不常规,即,您不能编写与这类字符串匹配的正则表达式。
请参阅SO question: Why are regular expressions called "regular" expressions和Wikipedia: Regular Languages。
您需要使用功能更强大的解析技术,例如CFG,例如ANTLR。
您可以从以下内容开始:
CastedExpression ::= Cast Expression | LPAR CastedExpression RPAR
Cast ::= LPAR Type RPAR
Expression ::= Sum | Product | Litteral | LPAR Expression RPAR | ...
Type ::= char | int | Type ASTERISK | ...
(如果您发现任何明显的改进,请随意编辑上面的语法。)
答案 1 :(得分:1)
本声明:
(平衡)的语言 带括号的表达式不是 经常,即你不能写一个 正则表达式匹配这些 一种字符串。
仅适用于病态正式意义上的经典正则表达式。它不适用于我们许多人每天使用的实用模式。
例如,使用原始有效输入列表中的第三个字符串,此Perl代码:
my $str = "((char)((x+y)&1))";
my $w = length length $str ;
my $rx = qr{ (?<PAREN>
\(
(?:
[^()] +
|
(?&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的模式不够强大。 ☹
答案 2 :(得分:0)
添加到aioobe的答案:
看起来你正在尝试编写表达式解析器。正如在另一个答案中已经说过的那样,使用正则表达式是不可能的。您应该考虑使用表达式解析器(如JEP)或使用javacc自行编写。