用正则表达式语法解释大括号

时间:2011-02-05 19:07:02

标签: regex syntax

我正在尝试破译浮点数的正则表达式(来自php.net)

LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})

LNUM表示一次或多次出现数字0到9。 DNUM表示零或更多的数字0到9,后跟一个小数点。我不知道如何解释{LNUM}。根据我的阅读,大括号意味着重复,但不会

[\.]{LNUM}

表示小数点的LNUM出现(这没有意义)。然后在交替的第二部分(在|字符之后),{LNUM}出现在开头,我没有在regexp语法(POSIX或Perl)中找到使用大括号的定义。有人可以帮我解决这个问题吗?

谢谢你, 比尔

2 个答案:

答案 0 :(得分:2)

这不是严格的正则表达式语法。 {LNUM}是LNUM定义的占位符。例如,严格的regexp语法中的第二行是

([0-9]*[\.][0-9]+) | ([0-9]+[\.][0-9]*)

答案 1 :(得分:1)

是的,与正则表达式无关,它看起来像一个变量替换 你说这是正式定义吗?在替换并查看指数表示法之后,看起来整个事物都可以减少。此外,量词的使用会产生无限大量的数字。并且它们不会在任何地方占用空间,也许它是对某些东西的严格解析。

[+-]?(([0-9]+ | ([0-9]*[\.][0-9]+) | ([0-9]+[\.][0-9]*)) [eE][+-]? [0-9]+)

[+-]?                # '+' or '-'  0 or 1 time
(                    # group 1, not needed
   (                    # group 2
        [0-9]+             # a digit, 1 or more times
      |                      # OR
        (                  # group 3
          [0-9]*              # a digit, 0 or more times
          [\.]                # a '.' exactly 1 time, character class not needed
          [0-9]+              # a digit, 1 or more times
        )                  # end group 3
      |                      # OR
        (                  # group 4
          [0-9]+             # a digit, 1 or more times
          [\.]               # a '.' exactly 1 time, character class not needed
          [0-9]*             # a digit, 0 or more times
        )                  # end group 4
   )                    # end group 2
   [eE]                 # 'e' or 'E' exactly 1 time
   [+-]?                # '+' or '-'  0 or 1 time
   [0-9]+               # a digit, 1 or more times
)                 # end group 1, not needed