正则表达式,我只是不正确

时间:2014-07-31 19:24:14

标签: 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}}被选为一个匹配。

有没有人知道如何解决这个问题,我真的需要一个正则表达式大师: - )

3 个答案:

答案 0 :(得分:2)

您可以使用基于负面预测的正则表达式:

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

RegEx Demo

答案 1 :(得分:1)

您必须使用以下正则表达式来获取大括号之间的内容:

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

<强> Working Demo

如果您要从发布的评论中排除内容,可以使用正则表达式技术排除您不想要的内容,并在正则表达式结束时保留您想要的内容:

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

<强> Working demo

顺便说一句,如果您想拥有上述正则表达式的快捷方式,可以使用:

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

这是一种非常有用的模式排除技术,我很高兴从Anubhava和zx81(他们使用正则表达式模式)中学习它。对于这种正则表达式技术,您可以使用捕获组找到所需的内容(请查看下面屏幕截图中的绿色突出显示):

enter image description here

答案 2 :(得分:0)

使用[^TMPL]之类的功能无法正常工作,因为这些是。你可以使用负向前瞻(或者甚至是后视,取决于你正在使用的正则表达式库)。

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

我仍然觉得您希望BOSEOS等只是模板中的字符串{{,并且要插入其他值。如果您使用的是把手或其他东西,可以插入字符串:

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