簡體   English   中英

字符串結尾正則表達式匹配太慢

[英]End-of-string regex match too slow

在這里演示 正則表達式:

([^>]+)$

我想匹配標簽中未包含的HTML片段末尾的文本(即尾隨文本節點)。 上面的正則表達式似乎是最簡單的匹配,但執行時間似乎與匹配文本的長度呈線性關系(並且在我的瀏覽器擴展中使用時會導致掛起)。 對於匹配和不匹配的文本,它也同樣慢。

為什么這個看似簡單的正則表達式如此糟糕?

(我也嘗試過RegexBuddy,但似乎無法從中獲得解釋。)

編輯:這是一個用於測試各種正則表達式的片段 (單擊控制台區域中的“運行”)。
編輯2:和不匹配測試

考慮這樣的輸入

abc<def>xyz

使用原始表達式([^>]+)$ ,引擎從a啟動,失敗啟動> ,回溯,從b重新啟動,然后從c啟動等等。是的,時間隨着輸入的大小而增長。 但是,如果你強迫發動機消耗的一切行動,以最右邊>第一,如:

.+>([^>]+)$

無論前面有多少輸入,回溯都將受到最后一段的長度的限制。

第二個表達式不等同於第一個表達式,但由於您使用的是分組,因此只需選擇matches[1]

提示:即使你定位javascript,也可以切換到pcre模式,這樣你就可以訪問步驟信息和調試器了:

在此輸入圖像描述

(看看綠色吧!)

您可以使用實際的DOM而不是Regex,這很耗時:

 var html = "<div><span>blabla</span></div><div>bla</div>Here I am !"; var temp = document.createElement('div'); temp.innerHTML = html; var lastNode = temp.lastChild || false; if(lastNode.nodeType == 3){ alert(lastNode.nodeValue); } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM