不匹配嵌套的出现与正则表达式

时间:2017-04-13 22:59:03

标签: javascript regex

我正在使用JavaScript编写HTML编辑器,尝试实现撤消功能。

所以我有这个HTML代码(隐藏的注释用于存储应用程序状态):

<!-- RECONSTRUCT: 'test1' -->
<h1>FOO</h1>
<!-- END RECONSTRUCT -->
<h1>BAR</h1>
<!-- RECONSTRUCT: 'test2' -->
<h1>FOOFOO</h1>
<!-- END RECONSTRUCT -->

我需要转换为此HTML代码:

test1
<h1>BAR</h1>
test2

基本上,html评论&#34;保存&#34;我需要将代码恢复到的旧状态。

所以我想让Regex实现的目标是:

[0:"test1", 1:"<h1>FOO</h1>", 2:"test2", 3:"<h1>FOOFOO</h1>"]

或类似的东西。

问题是,当我尝试使用这样的正则表达式时:

src.match(/<!-- RECONSTRUCT: '(.*)' -->(.*)<!-- RECONSTRUCT END -->/g)

我得到了

[0: "<!-- RECONSTRUCT: 'test1' --> ... FOO ... BAR <!-- RECONSTRUCT ... FOOFOO ... ->"]

所以输入完整的输入,因为它是一个有效的匹配。 我也没有让它与负面展望一起工作:

<!-- RECONSTRUCT: '(.*)' -->((?!RECONSTRUCT:).)*

你能帮助我吗?

1 个答案:

答案 0 :(得分:3)

在JavaScript中.与换行符不匹配,并且没有可用于覆盖此行为的修饰符(如s)。在JavaScript中执行此操作的方法是使用[^]而不是.,同时允许新行匹配。

还使用?

制作一些模式

var src = `<!-- RECONSTRUCT: 'test1' -->
<h1>FOO</h1>
<!-- END RECONSTRUCT -->
<h1>BAR</h1>
<!-- RECONSTRUCT: 'test2' -->
<h1>FOOFOO</h1>
<!-- END RECONSTRUCT -->`;

src = src.replace(
    /<!--\s*RECONSTRUCT:\s*'(.*?)'\s*-->[^]*?<!--\s*END RECONSTRUCT\s*-->/g, '$1');

console.log(src);