2016-04-21 60 views
0

我有以下正則表達式,它決定(我希望)如果一個字符串是一個URL或不是。JavaScript正則表達式在執行後有不同的結果

/^(((\/[\w-]+)+\/?)|(((http|ftp|https):\/\/)[\w-]+))((\.[\w-]+)?([\w.,@?^=%&amplL\/~+#-]*[\[email protected]?~=%&:\/~+#-])?)$/gi 

我發現是,如果我是正則表達式保存到一個對象,然後測試相同的字符串兩次,我得到兩個不同的結果顯示在此的jsfiddle

https://jsfiddle.net/gpc5trsw/

中的代碼此琴是這樣的:

var test = /^(((\/[\w-]+)+\/?)|(((http|ftp|https):\/\/)[\w-]+))((\.[\w-]+)?([\w.,@?^=%&amplL\/~+#-]*[\[email protected]?~=%&:\/~+#-])?)$/gi 
var str = "/api/WebTest"; 

document.getElementById("firstCtr").innerHTML = /^(((\/[\w-]+)+\/?)|(((http|ftp|https):\/\/)[\w-]+))((\.[\w-]+)?([\w.,@?^=%&amplL\/~+#-]*[\[email protected]?~=%&:\/~+#-])?)$/gi.test(str) 
document.getElementById("secondCtr").innerHTML = /^(((\/[\w-]+)+\/?)|(((http|ftp|https):\/\/)[\w-]+))((\.[\w-]+)?([\w.,@?^=%&amplL\/~+#-]*[\[email protected]?~=%&:\/~+#-])?)$/gi.test(str) 


document.getElementById("first").innerHTML = test.test(str) 
document.getElementById("second").innerHTML = test.test(str) 

具有以下HTML:

<div> 
First Run Control: <span id="firstCtr"></span> 
</div> 
<div> 
Second Run Control: <span id="secondCtr"></span> 
</div> 
<hr/> 
<div> 
First Run: <span id="first"></span> 
</div> 
<div> 
Second Run: <span id="second"></span> 

產生的HTML輸出是這樣:

首次運行控制:
第二運行控制:


首次運行:
第二次運行:false

爲什麼測試結果第二次在對象版本上測試時發生了變化? JavaScript可能會是一個殘酷的情婦有時......

+0

[刪除'g'標誌](https://jsfiddle.net/tusharj/gpc5trsw/1/) – Tushar

回答

1

使用/ g,正則表達式對象會記住你每次打電話給你的最後一個位置。它會工作,並在第一次得到正確的結果,但在下一個電話會從第一場比賽後的點開始。

很清楚如果u有2場比賽中作爲例子

var test = /\d+/gi 
var str = "1234 vvv 3333"; 
document.getElementById("firstCtr").innerHTML = /\d+/gi.test(str); 
document.getElementById("secondCtr").innerHTML = /\d+/gi.test(str); 
document.getElementById("first").innerHTML = test.test(str); 
document.getElementById("second").innerHTML = test.test(str); 

下面的輸出結果將是

First Run Control: true 
Second Run Control: true 
First Run: true 
Second Run: true 

如果你改變了海峽爲 「1234 VVVV」

您將獲得與您之前的結果相同的結果

First Run: true 
Second Run: false 
相關問題