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

时间:2010-10-11 06:40:32

标签: java regex

有效:

  1. ((int)10)
  2. (int)10
  3. ((char)((x+y)&1))
  4. ((int *)1)
  5. 无效:

    1. (a-b)
    2. (a&=b)
    3. a
    4. ((a))

3 个答案:

答案 0 :(得分:8)

(平衡的)带括号的表达式的语言是不常规,即,您不能编写与这类字符串匹配的正则表达式。

请参阅SO question: Why are regular expressions called "regular" expressionsWikipedia: 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自行编写。

相关问题