Nodejs 在下不才 请各位看官 求解js正则问题
Nodejs 在下不才 请各位看官 求解js正则问题
代码如下:
>var a=/\d+/g
undefined
>a.exec('a2a')
['2',index:1,input:'a2a']
>a.exec('a1a')
null
>/\d+/g.exec('a2a')
['2',index:1,input:'a2a']
>/\d+/g.exec('a1a')
['1',index:1,input:'a1a']
为什么第二次执行就会返回null而不是正确的
Nodejs 在下不才 请各位看官 求解js正则问题
问题描述
你遇到了一个关于JavaScript正则表达式 exec
方法的问题。你创建了一个全局匹配数字的正则表达式,并且尝试多次使用 exec
方法来匹配字符串。但是你发现,在第一次匹配成功后,第二次调用 exec
方法时返回了 null
而不是预期的结果。
示例代码
var a = /\d+/g;
console.log(a.exec('a2a')); // 输出 ['2', index: 1, input: 'a2a']
console.log(a.exec('a1a')); // 输出 null
问题分析
exec
方法在全局匹配模式(即正则表达式中包含 g
标志)下会记住上次匹配的位置,以便在后续调用中继续从该位置开始搜索。当没有更多匹配项时,它将返回 null
。当你再次使用同一个正则表达式对象去匹配新的字符串时,它仍然会从上次匹配结束的位置开始搜索,因此如果没有找到新的匹配项,它会返回 null
。
解决方案
如果你希望每次都从头开始进行匹配,可以重新创建一个新的正则表达式对象,或者在每次调用 exec
方法之前手动重置正则表达式的 lastIndex 属性:
var a = /\d+/g;
console.log(a.exec('a2a')); // 输出 ['2', index: 1, input: 'a2a']
// 清除 lastIndex 属性
a.lastIndex = 0;
console.log(a.exec('a1a')); // 输出 ['1', index: 1, input: 'a1a']
通过将 lastIndex
设置为 0,你可以确保每次调用 exec
方法时都从字符串的开头开始匹配。
总结
在全局匹配模式下,JavaScript 的正则表达式 exec
方法会记住上次匹配的位置。如果需要每次都从头开始匹配,可以重新创建正则表达式对象或手动重置 lastIndex
属性。
把 lastIndex 设置为 0 。
lastIndex 这个参数在哪里的啊?能写个例子吗
var a=/\d+/g a.exec(‘a2a’) //[‘2’] a.lastIndex = 0 a.exec(‘a1a’); //[‘1’]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
If your regular expression uses the “g” flag, you can use the exec method multiple times to find successive matches in the same string. When you do so, the search starts at the substring of str specified by the regular expression’s lastIndex property (test will also advance the lastIndex property). For example, assume you have this script:
var myRe = /ab*/g;
var str = "abbcdefabh";
var myArray;
while ((myArray = myRe.exec(str)) !== null)
{
var msg = "Found " + myArray[0] + ". ";
msg += "Next match starts at " + myRe.lastIndex;
console.log(msg);
}
谢啦 原来这样写对于js来说也是一个RegExp对象导致的
但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0
在你的例子中,正则表达式对象 a
使用了全局标志 g
。当使用全局标志时,exec
方法会在每次调用时从上一次匹配结束的位置开始继续查找。
第一次执行 a.exec('a2a')
时,找到了 '2'
,并更新了内部状态,所以第二次执行 a.exec('a1a')
时,它从上次匹配结束的位置(即 '2'
之后)开始查找,但没有找到更多的数字,因此返回 null
。
如果你想每次都能重新开始匹配,可以在调用 exec
方法之前重置正则表达式的 lastIndex 属性:
var a = /\d+/g;
console.log(a.exec('a2a')); // ['2', index: 1, input: 'a2a']
a.lastIndex = 0; // 重置 lastIndex
console.log(a.exec('a1a')); // ['1', index: 1, input: 'a1a']
这样可以确保每次执行 exec
都会从字符串的开头开始查找匹配项。