[英]Regex required: It should match for following patterns
有效:
((int)10)
(int)10
((char)((x+y)&1))
((int *)1)
无效:
(ab)
(a&=b)
a
((a))
(平衡的)带括号表达式的语言不是正则表达式,即,您不能编写与这些字符串匹配的正则表达式。
请参阅以下问题: 为什么将正则表达式称为“正则”表达式,而如何将Wikipedia:正则语言 称为 。
您需要使用功能更强大的解析技术,例如使用ANTLR的CFG。
您可以从以下内容开始:
CastedExpression ::= Cast Expression | LPAR CastedExpression RPAR
Cast ::= LPAR Type RPAR
Expression ::= Sum | Product | Litteral | LPAR Expression RPAR | ...
Type ::= char | int | Type ASTERISK | ...
( 如果发现任何明显的改进,请随时编辑上面的语法)。
这个说法:
(平衡的)带括号表达式的语言不是正规的,即,您不能编写与这些字符串匹配的正则表达式。
仅在病理形式上对经典正则表达式成立。 它并不适用于实际的模式,许多我们的日常使用。
例如,使用有效输入的原始列表中的第三个字符串,此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的模式还不够强大。 ☹
添加到aioobe的答案:
看起来您正在尝试编写表达式解析器。 正如在其他答案中已经说过的,使用正则表达式是不可能的。 您应该考虑使用表达式解析器(例如JEP),或者使用javacc编写自己的表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.