2015-10-16 40 views
2

從我的previous question有關正則表達式的問題。我被困住瞭解我得到的結果的差異,而且我擔心如果解析庫或其他東西時可能存在錯誤。由regex101.com忽略的未捕獲組

因此,最初的問題是,以取代所有:/在給定的字符串,除了那些可能是給定字符串中的內部標籤。初始的字符串是

not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a> 

我曾嘗試使用下面的正則表達式中給出的例子僅替換第一:/。要跳過occurances內標籤非捕獲組用於:

/(?:<[^\/]*?.*?<\/.*?>)|(:\/)/g 

什麼是最令人驚訝的是,這個正則表達式給出了不同的結果取決於刀具/語言被使用。下面是我

下面還有一段JavaScript代碼來檢查相同的正則表達式,結果,因爲你可以看到與預期的不同 - 2個匹配 - > 2個替換將發生。

var s = 'not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>'; 
 
var replaced = s.replace(/(?:<[^\/]*?.*?<\/.*?>)|(:\/)/g, "smiley_image_here"); 
 
document.querySelector("pre").textContent = replaced;
<pre></pre>

看來,非捕獲組會被忽略。 那麼,什麼是錯誤的,爲什麼結果不同,什麼是正確的正則表達式來解決最初的問題?

+0

似乎並非如此,因爲特別是名爲「匹配信息」的部分只顯示一個匹配 – kaytrance

回答

1

regex101也返回2場比賽,因爲你可以在標籤上看到:

total matches

,並在文本的2種不同的顏色

colors

這確實是一個有點混亂如果你看看MATCH INFORMATION部分。然而,這只是用來向您展示捕捉,不一定匹配: https://regex101.com/r/kY6vI5/2


captures


你不妨用一些字符串替換每個匹配測試此

non-capturing group不被忽略。它根本不創建捕獲,但它實際上匹配。

+0

那麼我如何使用它替換此示例中的第一個* smile *?在我看來,這個問題是無法解決的 – kaytrance

+1

只有當組創建捕獲時,您才需要嵌套函數來替換:http://jsfiddle.net/tvcu9r4r/ ...但是,不要使用正則表達式來解析HTML,[使用DOM代替](http://stackoverflow.com/a/33152209/5290909) – Mariano