猿问

Javascript 拆分文本和正则表达式

我在 debian 下使用 firefox,我不明白 javascript 的行为:


var testRegex = /yolo .+ .+/gu;

let test = `yolo 2 abc

yolo 2 abc`;


test = test.split('\n');


for (let t=0; t < test.length; t++)

{

    console.log(test[t], testRegex.exec(test[t]));

}

它发回:


更奇怪的事情:


for (let t=0; t < test.length; t++)

{

    console.log(test[t], testRegex.exec(test[t]), test[t].match(testRegex));

}

退还:


http://img2.mukewang.com/60e6a78a0001285f03900034.jpg

我不认为这可能是编码问题,也不是我的代码。


我能做什么?


慕的地8271018
浏览 164回答 1
1回答

九州编程

这实际上是预期的行为,信不信由你。exec()JavaScript regex 上的方法是有状态的,旨在成为人们在循环中调用的东西。每次后续执行都将返回字符串中的下一个匹配项,直到找不到更多匹配项为止,此时null将返回。为了在第一个示例中突出显示这一点,让我们快速简化一下代码并显示每个变量中的值。let testRegex = /yolo .+ .+/gu;let test = [&nbsp; "yolo 2 abc",&nbsp; "yolo 2 abc"]这会导致您的调用testRegex.exec看起来像以下内容:testRegex.exec("yolo 2 abc") // => Array ["yolo 2 abc"]testRegex.exec("yolo 2 abc") // => null您可以在此处找到有关此内容的官方文档,其中说明:如果您的正则表达式使用“g”标志,您可以exec()多次使用该方法来查找同一字符串中的连续匹配项。当您这样做时,搜索从str正则表达式的lastIndex属性指定的子字符串开始(test()也将推进该lastIndex属性)。请注意,lastIndex搜索不同的字符串时不会重置该属性,它将从现有的lastIndex.您提供的第二个示例没有遇到此问题的原因是该match()函数在lastIndex内部将属性重置为 0,重置搜索位置并导致第二次调用exec()从正则表达式的开头进行搜索。回到你原来的例子,你可以修改它如下,你会看到你期望的行为:var testRegex = /yolo .+ .+/gu;let test = `yolo 2 abcyolo 2 abc`;test = test.split('\n');for (let t=0; t < test.length; t++){&nbsp; &nbsp; console.log(test[t], testRegex.exec(test[t]));&nbsp; &nbsp; testRegex.lastIndex = 0;}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答