我正在使用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:).)*
你能帮助我吗?
答案 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);