用一行 JavaScript 刪除嵌套模式
這是我想出的一個巧妙的小技巧,用於從字符串中刪除嵌套模式。
var str = "abc<1<2<>3>4>def"; while (str != (str = str.replace(/<[^<>]*>/g, ""))); // str -> "abcdef"
請注意,這個單行中的正則表達式根本不嘗試處理嵌套模式。 while
循環的條件替換 <…>
的實例 (內部模式中不允許使用尖括號)和空字符串。這從內到外重複,直到正則表達式不再匹配。此時替換的結果與主題字符串相同,循環結束。
您可以使用類似的方法來抓取嵌套模式而不是刪除它們,如下所示。
[編輯 (6/6/2008): 以下代碼無法正確處理“((a)(b))”之類的輸入。如果您在此博客上瀏覽標籤遞歸,您會發現許多其他方法可以匹配實際正常工作的嵌套結構。]
var str = "abc(d(e())f)(gh)ijk()", re = /\([^()]*\)/, output = [], match, parts, last; while (match = re.exec(str)) { parts = match[0].split("\uFFFF"); if (parts.length < 2) { last = output.push(match[0]) - 1; } else { output[last] = parts[0] + output[last] + parts[1]; } str = str.replace(re, "\uFFFF"); } // output -> ["(d(e())f)", "(gh)", "()"]
由於我們再次從內向外工作,重新組裝每個完整的匹配需要我們標記上一個最深層匹配被刪除的位置。我使用了 Unicode 轉義序列 \uFFFF
標記這些位置,因為這是一個永久未分配的代碼點。
請注意,使用像 [^()]
這樣的否定字符類 僅當您使用像 (…)
這樣的單字符分隔符時,才能匹配此處示例中所示的內部模式 或 <…>
.如果你想匹配/刪除使用多字符分隔符的嵌套模式,你可以使用像 /<<(?:(?!<<|>>)[\S\s])*>>/
這樣的正則表達式 .只需更改 <<
的兩個實例 到你的左分隔符和 >>
到你的右分隔符。
上一篇
定時記憶