繁体   English   中英

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

[英]Regex required: It should match for following patterns

有效:

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

无效:

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM