繁体   English   中英

为什么只有第一个正则表达式可以正常工作?

[英]Why does only the first regex work properly?

我正在用javascript测试正则表达式:

    var a = prompt("Input: ")
    var t = /I AM (.*)|MY NAME IS (.*)/
    if(t.test(a)) {
    b = "HI " + t.exec(a)[1]
    alert(b)
    }

如果输入“ I AM BOB”,则得到“ HI BOB”,如果输入“ MY NAME IS BOB”,则得到“ HI undefined”,当我将“ I AM(。*)”放在正则表达式中的第二位时,也会导致未定义。

那么,为什么这个正则表达式完全可以在if语句中工作,而只在exec()的前半部分工作呢? 我该如何解决?

Ps(使用exec(a)[0]仅返回“ HI MY NAME IS BOB”)

尝试在|周围使用括号 运算符并排除(.*)捕获组。 您可以使用?:将OR组设为非捕获组:

var a = prompt("Input: ")
var t = /(?:I AM|MY NAME IS) (.*)/
if(t.test(a)) {
    b = "HI " + t.exec(a)[1]
    alert(b)
}

编辑:您的原始代码失败的原因是与"MY NAME IS BOB"匹配,第二个捕获组匹配,因此您需要使用t.exec(a)[2]来获取"HI BOB"作为警报。

PS为避免进行两次匹配(一次用于t.test(a)一次,一次用于t.exec(a) ),您可以这样做:

var a = prompt("Input: ")
var t = /(?:I AM|MY NAME IS) (.*)/
var result = t.exec(a) // will be null whenever t.test(a) would return false
if(result) {
    b = "HI " + result[1]
    alert(b)
}

RegExp.prototype.exec返回一个包含匹配文本的数组,然后为每个捕获括号添加一个项目。

  • 在“我是鲍勃”上:

    • t.exec(a)返回["I AM BOB", "BOB", undefined] 它返回未定义,因为第二个捕获括号没有捕获任何内容。

  • 在“我的名字是鲍勃”上:

    • t.exec(a)返回["MY NAME IS BOB", undefined, "BOB"]

要修复它,您必须访问t.exec(a)[2] 泰德·霍普(Ted Hopp)解决此问题的解决方案是您要做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM