интерпретация скобок в синтаксисе регулярных выражений - PullRequest
2 голосов
/ 05 февраля 2011

Я пытаюсь расшифровать это регулярное выражение формального определения чисел с плавающей запятой (из 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}, и я не нахожу определения для этого использования фигурных скобок в синтаксисе регулярного выражения (POSIX или Perl).Может кто-нибудь объяснить это мне?

Спасибо, Билл

Ответы [ 2 ]

2 голосов
/ 05 февраля 2011

Это не строгий синтаксис регулярных выражений. {LNUM} является заполнителем для определения LNUM. Например, вторая строка в строгом синтаксисе регулярных выражений:

([0-9]*[\.][0-9]+) | ([0-9]+[\.][0-9]*)
1 голос
/ 05 февраля 2011

Да, не имеет ничего общего с регулярным выражением, это похоже на подстановку переменных.
Вы говорите, что это формальное определение? После подстановки и просмотра обозначений экспоненты, похоже, что все это можно урезать. Кроме того, использование квантификаторов может привести к бесконечно большому числу цифр. И они нигде не учитывают пробелы, может быть, это строгий анализ чего-то.

[+-]?(([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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...