JavaScript >> Javascript 文檔 >  >> JavaScript

用一行 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])*>>/ 這樣的正則表達式 .只需更改 << 的兩個實例 到你的左分隔符和 >> 到你的右分隔符。


上一篇
Tutorial JavaScript 教程
  1. WebGL 月。第 28 天。點擊檢測。第二部分

  2. 如何使用 Prepros 設置 React 和 Sass

  3. 滾動到視口中心

  4. 通過 JavaScript async await 解釋 Haskell do 符號 - 第 1 部分

  5. JavaScript中map函數組成的reduce函數

  6. 使用 React Context API 創建多語言網站

  7. 在 ChartJS 中設置軸標籤顏色

  1. 不是每個函數都需要一個名字

  2. 使用javascript確定從div頂部到窗口頂部的距離

  3. 為什麼 indexOf 會這樣輸出?

  4. 觸發谷歌地圖標記點擊

  5. 5 個用於移動開發的輕量級 jQuery 替代方案

  6. 首選顏色方案:CSS 媒體查詢

  7. Firebase V9 的整潔的用戶和配置文件 React Hooks

  1. 將 Heroku Postgres 與 NestJS 後端連接起來

  2. 理解和實現 Node.js 中的速率限制

  3. 使用 Nodejs 和 Puppeteer 抓取足球數據

  4. 2021 年可以使用的 6 個最佳 React 儀表板模板