请教:正则表达式中参数g对匹配结果的影响问题.

时间:2022-01-24 06:09:19
<html>
<body>
<form name="data">
  <input type=text name=A1 value=1 />
  <input type=text name=A2 value=2 />
  <input type=text name=A3 value=3 />
  <input type=text name=A4 value=4 />
</form>
</body>
</html>
<script language=javascript>
var elements = document.data.elements;
var reg = /A\d+/g;   ////////this is a regex
var str = "";
for (var i = 0; i < elements.length; i++) {
  var ele = elements[i];
  if (reg.test(ele.name)) {
    if (str == "") {
      str = str + ele.name + "=" + ele.value;
    } else {
      str = str + "&" + ele.name + "=" + ele.value;
    }
  }
}
alert(str);
</script>

在regex中不带上参数g的时候最后的结果是正确的str="A1=1&A2=2&A3=3&A4=4".但是加上参数g之后结果会变成str="A1=1&A3=3".g只是表示全局匹配,应该对结果不会造成影响,百思不得其解,请高手指教

6 个解决方案

#1


测试了一下,是有点奇怪,帮你顶一下

#2


<html>
<body>
<form name="data">
  <input type=text name=A1 value=1 />
  <input type=text name=A2 value=2 />
  <input type=text name=A3 value=3 />
  <input type=text name=A4 value=4 />
</form>
</body>
</html>
<script language=javascript>
var elements = document.data.elements;
var str = "";
for (var i = 0; i < elements.length; i++) {
  var ele = elements[i];
var reg = /A\d+/g;   ////////this is a regex    把这一句加在循环中
  if (reg.test(ele.name)) {
    if (str == "") {
      str = str + ele.name + "=" + ele.value;
    } else {
      str = str + "&" + ele.name + "=" + ele.value;
    }
  }
}
alert(str);
</script>

#3


for (var i = 0; i < elements.length; i++) {
  var ele = elements[i];
  if (/A\d+/g.test(ele.name)) {
    if (str == "") {
      str = str + ele.name + "=" + ele.value;
    } else {
      str = str + "&" + ele.name + "=" + ele.value;
    }
  }

#4


这个问题我知道解决办法,但想知道why.为什么会出现中间test=false的问题,而且是很规律的隔一个出现一次.
谢谢尖刀和vivian的意见

#5


加了全局参数g的正则,每次test,将跟随上次的搜索位置继续搜索下去,只到搜索到文本结束才会将搜索起始位置置为0

所以偶数次test执行将使搜索紧接着上次RegExp.lastIndex继续搜索下去,显然这时没有匹配了,因为index指向2,即字符串的结尾。一旦达到结尾,RegExp对象将复位。于是再下次搜索又从index=0开始。

所以奇数次有效,偶数次无效,因为偶数次是紧接着奇数次继续搜索的(这都是g的作用)。

#6


多谢kangel解惑,也谢谢尖刀和vivian的热心帮助:)

#1


测试了一下,是有点奇怪,帮你顶一下

#2


<html>
<body>
<form name="data">
  <input type=text name=A1 value=1 />
  <input type=text name=A2 value=2 />
  <input type=text name=A3 value=3 />
  <input type=text name=A4 value=4 />
</form>
</body>
</html>
<script language=javascript>
var elements = document.data.elements;
var str = "";
for (var i = 0; i < elements.length; i++) {
  var ele = elements[i];
var reg = /A\d+/g;   ////////this is a regex    把这一句加在循环中
  if (reg.test(ele.name)) {
    if (str == "") {
      str = str + ele.name + "=" + ele.value;
    } else {
      str = str + "&" + ele.name + "=" + ele.value;
    }
  }
}
alert(str);
</script>

#3


for (var i = 0; i < elements.length; i++) {
  var ele = elements[i];
  if (/A\d+/g.test(ele.name)) {
    if (str == "") {
      str = str + ele.name + "=" + ele.value;
    } else {
      str = str + "&" + ele.name + "=" + ele.value;
    }
  }

#4


这个问题我知道解决办法,但想知道why.为什么会出现中间test=false的问题,而且是很规律的隔一个出现一次.
谢谢尖刀和vivian的意见

#5


加了全局参数g的正则,每次test,将跟随上次的搜索位置继续搜索下去,只到搜索到文本结束才会将搜索起始位置置为0

所以偶数次test执行将使搜索紧接着上次RegExp.lastIndex继续搜索下去,显然这时没有匹配了,因为index指向2,即字符串的结尾。一旦达到结尾,RegExp对象将复位。于是再下次搜索又从index=0开始。

所以奇数次有效,偶数次无效,因为偶数次是紧接着奇数次继续搜索的(这都是g的作用)。

#6


多谢kangel解惑,也谢谢尖刀和vivian的热心帮助:)