我正在定义一个正则表达式对象,然后在循环中匹配它.它有时只是匹配,确切地说 - 每隔一次.所以我创建了这个问题的最小工作样本.
我在Opera和Firefox中尝试了这段代码.两者的行为是相同的:
>>> domainRegex = /(?:\.|^)([a-z0-9\-]+\.[a-z0-9\-]+)$/g;
/(?:\.|^)([a-z0-9\-]+\.[a-z0-9\-]+)$/g
>>> domainRegex.exec('mail-we0-f174.google.com');
Array [".google.com", "google.com"]
>>> domainRegex.exec('mail-we0-f174.google.com');
null
>>> domainRegex.exec('mail-we0-f174.google.com');
Array [".google.com", "google.com"]
>>> domainRegex.exec('mail-we0-f174.google.com');
null
>>> domainRegex.exec('mail-we0-f174.google.com');
Array [".google.com", "google.com"]
>>> domainRegex.exec('mail-we0-f174.google.com');
null
Run Code Online (Sandbox Code Playgroud)
为什么会这样?这种行为是否有记录?除了在循环体内定义正则表达式之外,还有其他方法吗?
Ja͢*_*͢ck 18
exec()以你描述的方式工作; 如果/g存在修饰符,它将返回一个匹配项,从lastIndex每次调用开始直到没有更多匹配,此时它返回null并且值lastIndex重置为0.
但是,因为您使用$不会有多个匹配来锚定表达式,所以您可以使用String.match()而不是丢失/g修饰符:
var domainRegex = /(?:\.|^)([a-z0-9\-]+\.[a-z0-9\-]+)$/;
'mail-we0-f174.google.com'.match(domainRegex); // [".google.com", "google.com"]
Run Code Online (Sandbox Code Playgroud)
小智 6
Ja\xcd\xa2cks响应的附加信息:
\n\n您还可以设置lastIndex
\n\nvar myRgx = /test/g;\nmyRgx.exec(someString);\nmyRgx.lastIndex = 0;\nRun Code Online (Sandbox Code Playgroud)\n\n或者只是为每次执行创建一个新的正则表达式,我发现这更干净
\n\nnew RegExp(myRgx).exec(someString);\nRun Code Online (Sandbox Code Playgroud)\n