Regex, я просто не понимаю
Я просто не получаю право на 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}}
выбран как одно совпадение.
Кто-нибудь знает, как это решить, мне действительно нужен гуру регулярного выражения :-)
Использование [^TMPL]
и т.п. не будет работать, потому что это классы символов. Однако вы можете использовать негативный просмотр (или даже lookbehind в зависимости от библиотеки регулярных выражений, которую вы используете).
\{\{(?!BOS:)(?!EOS:)(?!Render:)(?!TMPL:)(.*?)\}\}
Тем не менее у меня возникает ощущение, что вы хотите, чтобы BOS
, EOS
и т.д. Просто были строками в шаблоне с {{
и другими значениями, которые нужно интерполировать). Если вы используете рули или что-то еще, вы можете интерполировать строки:
{{'{{BOS:Sequence}}'}}
Вы можете использовать регулярное выражение с зависимым от вида следующим образом:
{{(?!TMPL|[BE]OS|Render).*?}}
Демо-версия RegEx
Для получения содержимого между фигурными скобками необходимо использовать следующее регулярное выражение:
\{\{(.*?)\}\}
Если вы хотите исключить контент из опубликованного комментария, вы можете использовать технику regex, чтобы исключить то, чего вы не хотите, и сохранить то, что вы хотите в конце регулярного выражения:
\{\{BOS:Sequence\}\}|\{\{EOS:Sequence\}\}|\{\{TMPL:Import.*?\}\}|\{\{Render:Tabs\}\}|\{\{(.*?)\}\}
Кстати, если вы хотите иметь ярлык для этого регулярного выражения, вы можете использовать:
\{\{(?:BOS|EOS):Sequence\}\}|\{\{TMPL:Import.*?\}\}|\{\{Render:Tabs\}\}|\{\{(.*?)\}\}
Это очень полезный метод исключения шаблонов, который я рад узнать из Anubhava и zx81 (они качают по шаблону регулярных выражений). Для этого метода регулярного выражения вы можете найти контент, который вам нужен, используя группы захвата (проверьте зеленые блики на скриншоте ниже):