2017-04-13 36 views
0

我正在使用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註釋「保存」我需要恢復代碼的舊狀態。

所以我希望有一個正則表達式來實現的是:

[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:).)* 

你能幫我: 我也是不得到它與未來的負面看工作?

回答

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);

+0

哇!感謝您的快速和驚人的輕鬆答案! 真的很感激它,並希望我可以給你一杯飲料。 – user1781595

+0

快速問題:你的正則表達式如何解決「嵌套事件」 - 問題?爲什麼輸入不會被解釋爲像我的搜索結果中的單個(並且唯一)結果? – user1781595

+0

當我嘗試你的'match'時,我得到'null'結果(這是正常的,因爲'。*'不會穿過換行符),所以我無法真正比​​較。另外,我沒有在你的示例中看到任何真正的嵌套事件。 *嵌套*意味着什麼? – trincot

相關問題