Regex Tag-Within-Tag - PullRequest
       0

Regex Tag-Within-Tag

0 голосов
/ 18 марта 2012

У меня довольно простая проблема с регулярным выражением для небольшого личного эксперимента, который я не совсем понял.

В строке у меня может быть несколько <tag>[some characters here], которым мне нужно соответствовать.Очевидный способ сделать это - использовать регулярное выражение /<tag>\[.*?\]/, чтобы сопоставить любые символы после <tag>[ и до ].

. Я бы хотел иметь <tag> s.в течение <tag> с, однако.Это вызывает проблему.Если бы у меня было следующее:

<tag>[some characters <tag>[in here] to match]

, регулярное выражение прекратило бы сопоставление, как только оно достигло первой закрывающей скобки, и полностью не совпало с последней частью инструкции.Я попытался решить эту проблему, сказав регулярному выражению игнорировать любые внутренние <tag> s, чтобы позже я мог сопоставить удаленное содержимое.Я не совсем понял, как это работает.Самое близкое, что я получил, это:

/<tag>\[(.*?(?:<tag>\[.*?\])*?.*?)\]/

, который не совсем работает.Я надеюсь, что он будет соответствовать любому количеству символов и любым внутренним тегам, если они существуют.Однако у него все еще есть проблемы с этой первой закрывающей скобкой.

Может быть, кто-то, кто лучше разбирается в регулярных выражениях, знает хорошее решение для этого.

1 Ответ

6 голосов
/ 18 марта 2012

Хотя вам, вероятно, следует отбросить регулярное выражение и сделать это вручную, если мини-язык становится более сложным, вы можете использовать рекурсивное регулярное выражение.

Ваше регулярное выражение будет выглядеть примерно так:

/(?<reg>(\w+\[([^\]\[]|\g<reg>)*\]))/

Вы можете увидеть это в действии здесь: http://rubular.com/r/9F7isgZpj9

Вот регулярное выражение, разбитое на части:

(?<reg>(    # start a regex named "reg"
  \w+       # the tag name
  \[        # open bracket
  (         # which can contain
    [^\]\[] # non-bracket characters
    |       # or
    \g<reg> # sub-tags (this is where the magic happens)
  )*        # zero or more times
  \]        # close the tag
 )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...