2012-03-18 2 views
0

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

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

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

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

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

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

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

Возможно, кто-то, кто лучше подходит к регулярным выражениям, хорошо знает это.

+0

Это ISN Особенно хорошо, что регулярное выражение отлично подходит, поскольку язык, который у вас есть, не выглядит регулярным. –

ответ

6

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

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

/(?<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 
) 
) 
+0

Ruby regex делает рекурсию? Узнавайте что-то новое каждый день! +1 – ridgerunner

+0

@ridgerunner Я действительно не знаю рубина, но google говорит, что он делает с версии 1.9 по умолчанию или с каким-то плагином в старых версиях. –

+0

Полностью новая концепция для меня. Это прямо вверх. Я собираюсь поиграть с ним и посмотреть, как это происходит. Изменить: работает как шарм. Я понятия не имел, что вы можете использовать рекурсивные регулярные выражения! – KChaloux

Смежные вопросы