如何分隔两个正则表达式(用于从注释区域的括号中取出文本)?

时间:2016-09-26 10:45:05

标签: regex

我有一些html页面,它看起来像:

<span>Some text</span>
<p>And again</p>

<table>
    <thead>
        <tr>
            <th>Text</th>
            <th>Text [some text]</th>
            <th>Text</th>
        </tr>
    </thead>

    <tbody>
        <!--[content-->
        <tr>
            <td>again some txt but with [this]</td>
            <td>in this td the same situation [oops]</td>
            <td>hello [world]</td>
        </tr>
        <!--content]-->
    </tbody>
</table>

<span>here is [the text]</span>

我需要从方括号中获取文本,但只需在注释字段中。我有2个reg exp,它们工作正常,但是分开。

/[^[\]]+(?=])/g - this is for text in brackets;
(?=<!--\[content)([\s\S]*?content]-->) - for commented fields.  

但我无法将它结合起来。我正在尝试这个(?=<!--\[content)([^[\]]+(?=]))([\s\S]*?content]-->),但它不起作用。我不太了解regexp,我该如何结合呢?

UPD:对于输出,我只需要在注释字段(this,oops,world)之间的括号中添加文本。

1 个答案:

答案 0 :(得分:1)

首先,我可以从一个简单的开始:

(?<=\[)[^\]\[]*(?=\])(?=[\s\S]*?<!--content\]-->)

<强>解释

(?<=\[)[^\]\[]*(?=\])匹配任何方括号内的文字,

(?=[\s\S]*?<!--content\]-->)预测任何后跟封闭内容标记的字符串。

它的声音很有意义!无论如何,,请查看DEMO1。是的......它没用。那么,问题是为什么???

在上面的正则表达式中,前瞻性断言仍然存在一些问题,正如我之前在前面的解释中所提到的那样:

(?=[\s\S]*?<!--content\]-->)预测任何后跟封闭内容标记的字符串

这是错误,应该是:

(?=[\s\S]*?<!--content\]-->)预测任何字符串后跟任何打开或关闭的内容标记

所以,结论我们的问题是正则表达式[\s\S]*?有时它只匹配“多个内容标记”。

解决方法

为了防止出现上述问题,我们可以将开放内容标记的另一个负面预测与[\s\S]*生成的每个字符结合起来。因此,我们得到:

(?<=\[)[^\]\[]*(?=\])(?=(?:(?!<!--\[content-->)[\s\S])*?<!--content\]-->)

请注意

[\s\S]*

刚修改为

(?:(?!<!--\[content-->)[\s\S])*?

这意味着(?!<!--\[content-->)会产生在[\s\S]*生成的每个字符的前面。例如,如果[\s\S]*生成ABCDEF...,则会以这种方式生成否定前瞻:

(?!<!--\[content-->)A(?!<!--\[content-->)B(?!<!--\[content-->)C(?!<!--\[content-->)D(?!<!--\[content-->)E(?!<!--\[content-->)F...

最后,请检查DEMO2。看到了吗?这只是工作!

免责声明:只有您在问题上提供的简单示例,我的正则表达式才能正常工作。对于另一个复杂的例如一些递归结构,我无法保证。