2016-04-21 37 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 
相关问题