javascript正则表达式匹配/执行问题

javascript正则表达式匹配/执行问题,javascript,regex,exec,match,Javascript,Regex,Exec,Match,我不确定这是一个bug,还是我不了解javascript正则表达式方法的行为(最后一个可能更可能) 问题是我无法让/(something | something)/类型的regexp在没有全局标识符的情况下使用match或exec方法,例如/(somereg1 | somereg2)/g 当全局标识符存在时,方法将正确返回它找到的每个实例。但当不存在时,这两种方法都只正确返回找到的第一个匹配项。问题是他们退了两次!?例如在句子中: var str = "Here is somereg1 and

我不确定这是一个bug,还是我不了解javascript正则表达式方法的行为(最后一个可能更可能)

问题是我无法让/(something | something)/类型的regexp在没有全局标识符的情况下使用match或exec方法,例如/(somereg1 | somereg2)/g

当全局标识符存在时,方法将正确返回它找到的每个实例。但当不存在时,这两种方法都只正确返回找到的第一个匹配项。问题是他们退了两次!?例如在句子中:

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/(somereg1|somereg2)/)
返回“somereg1” 相反,它返回“somereg1,somereg1”

检查此JSFIDLE:

代码应该是相当自解释的。第一个例子来自W3学校

如果你有任何问题,请告诉我


\Peter

第一个元素是正则表达式的完全匹配。如果您尝试了以下方法:

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/.*(somereg1|somereg2)/)
您的结果将是
[“这里是somereg1和somereg2”,“somereg2”]

.exec(str)
方法也会出现同样的行为

你可能想了解和

编辑:关于“子括号macthes”,在正则表达式中,括号分隔。如果你有这个正则表达式:

/.*(somereg1).*?(somereg2)/
您的
.match
结果将是
[“这里是somereg1和somereg2”,“somereg1”,“somereg2”]
。因此,如您所见,结果数组由完整匹配和所有捕获组匹配组成

要强制不捕获组,只需使用
(?:
进行分隔:


注意:在JavaScript中,捕获组不能与全局(
/g
)正则表达式一起使用。

您可以使用以下方法获取请求。结果:

var str = "Here is somereg1 and somereg2" //I would expect 
str.match(/(?=(somereg1|somereg2))/)

至于比赛和执行。我要说的是,使用regex对象进行匹配,并防止您对用作re的字符串进行双重转义和全部转义。

修改第二行,如下所示:

str.match(/somereg1|somereg2/)

匹配数组中的第一个元素由正则表达式完全匹配。从第二个元素开始,你们将获得所有捕获的组。结果将是数组[“somereg1”]Madhura,这正是我要寻找的!但我理解的唯一原因是因为丹尼洛的回答。谢谢,我要用这个。链接不错!我理解他们现在为什么这样做。虽然我不明白为什么它被设计成这样来返回子括号匹配?现在它是有意义的。很高兴知道如何使它不包括这些子组,我只是想知道。
str.match(/somereg1|somereg2/)