为何两个JavaScript正则表达式结果不同?如何用RegExp实现一致结果?
让RegExp构造函数返回与字面量正则相同结果的方法
要得到和你第一块代码完全一致的匹配结果,其实很简单——去掉RegExp构造函数里的全局标志 "g" 就行。调整后的代码如下:
const regEx2 = new RegExp("(?:\\S+\\s)?\\S*text\\S*(?:\\s\\S+)?"); const fullText2 = "one two text three four"; console.log(fullText2.match(regEx2));
运行这段代码,你会得到和第一块代码一模一样的输出:[ 'two text three', index: 4, input: 'one two text three four', groups: undefined ]
为什么之前的结果不一样?
问题出在全局标志 "g" 对match()方法的影响上:
- 当正则没有
"g"标志时,String.prototype.match()会返回一个包含**第一个匹配内容、匹配位置(index)、原始输入字符串(input)**等元信息的数组,这就是你第一块代码的结果。 - 当正则加上
"g"后,match()的行为会变成返回所有匹配到的字符串组成的数组,不会附带任何位置或输入信息。你第二块代码得到[ 'text' ]可能是个小意外,正常情况下这个正则应该能匹配到'two text three',但核心差异还是全局标志的影响。
如果你必须保留全局标志...
要是因为某些场景不得不保留"g"标志,又想获取单个匹配的详细信息,可以改用RegExp.prototype.exec()方法:
const regEx2 = new RegExp("(?:\\S+\\s)?\\S*text\\S*(?:\\s\\S+)?", "g"); const fullText2 = "one two text three four"; console.log(regEx2.exec(fullText2));
这个方法在全局模式下也会返回包含详细元信息的匹配结果(每次调用返回下一个匹配项,这里只有一个匹配)。
内容的提问来源于stack exchange,提问作者Hoa
相关产品推荐
相关产品推荐

