Regex, я просто не понимаю

70
8

Я просто не получаю право на Regex:

У меня есть следующий шаблон:

<!-- Defines the template for the tabs. -->
{{TMPL:Import=../../../../Data/Templates/Ribbon/tabs.tmpl; Name=Tabs}}
<div class="tabs">
<ul role="tablist">
{{BOS:Sequence}}
<li role="tab" class="{{TabType}}" id="{{tabId}}">
<span>{{TabFile}}</span>
</li>
{{EOS:Sequence}}
</ul>
</div>
{{Render:Tabs}}

Я хотел бы найти все между {{}} кроме тегов, которые начинаются с {{BOS, {{EOS, {{TMPL, {{Render

Вот пара подходов:

Попытка 1:

({{).*(}})

Это выбирает все между {{ }} тегами, что не очень хорошо.

Попытка 2:

({{)[^TMPL][^BOS][^EOS][^Render].*(}})

Это приведет к тому, что {{TabType}} и {{TabFile}} больше не будут выбраны, и я просто не знаю почему.

С некоторым другим регулярным выражением я получаю, что {{TabType}}" id="{{tabId}} выбран как одно совпадение.

Кто-нибудь знает, как это решить, мне действительно нужен гуру регулярного выражения :-)

спросил(а) 2014-07-31T22:24:00+04:00 6 лет, 1 месяц назад
1
Решение
109

Использование [^TMPL] и т.п. не будет работать, потому что это классы символов. Однако вы можете использовать негативный просмотр (или даже lookbehind в зависимости от библиотеки регулярных выражений, которую вы используете).

\{\{(?!BOS:)(?!EOS:)(?!Render:)(?!TMPL:)(.*?)\}\}

Тем не менее у меня возникает ощущение, что вы хотите, чтобы BOS, EOS и т.д. Просто были строками в шаблоне с {{ и другими значениями, которые нужно интерполировать). Если вы используете рули или что-то еще, вы можете интерполировать строки:

{{'{{BOS:Sequence}}'}}

ответил(а) 2014-07-31T22:29:00+04:00 6 лет, 1 месяц назад
70

Вы можете использовать регулярное выражение с зависимым от вида следующим образом:

{{(?!TMPL|[BE]OS|Render).*?}}

Демо-версия RegEx

ответил(а) 2014-07-31T22:29:00+04:00 6 лет, 1 месяц назад
57

Для получения содержимого между фигурными скобками необходимо использовать следующее регулярное выражение:

\{\{(.*?)\}\}

Рабочая демонстрация

Если вы хотите исключить контент из опубликованного комментария, вы можете использовать технику regex, чтобы исключить то, чего вы не хотите, и сохранить то, что вы хотите в конце регулярного выражения:

\{\{BOS:Sequence\}\}|\{\{EOS:Sequence\}\}|\{\{TMPL:Import.*?\}\}|\{\{Render:Tabs\}\}|\{\{(.*?)\}\}

Рабочая демонстрация

Кстати, если вы хотите иметь ярлык для этого регулярного выражения, вы можете использовать:

\{\{(?:BOS|EOS):Sequence\}\}|\{\{TMPL:Import.*?\}\}|\{\{Render:Tabs\}\}|\{\{(.*?)\}\}

Это очень полезный метод исключения шаблонов, который я рад узнать из Anubhava и zx81 (они качают по шаблону регулярных выражений). Для этого метода регулярного выражения вы можете найти контент, который вам нужен, используя группы захвата (проверьте зеленые блики на скриншоте ниже):

enter image description here

ответил(а) 2014-07-31T22:27:00+04:00 6 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема