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

时间:2014-10-05 01:49:44

标签: javascript regex

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

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

如果您输入“我是BOB”,您将获得“HI BOB”,如果您输入“MY NAME IS BOB”,您将获得“HI undefined”,当我将“I AM(。*)”第二个放入正则表达式然后它将导致未定义。

那么为什么这个正则表达式完全在if语句中工作,而只在exec()的前半部分工作?我怎么能解决它?

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

2 个答案:

答案 0 :(得分:4)

尝试在|运算符周围使用parens,并将(.*)捕获组分解出来。您可以使用?:

将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"作为警报。

P.S。为避免两次匹配(一次为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)
}

答案 1 :(得分:0)

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

  • On"我是BOB":

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

  • On"我的名字是BOB":

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

要解决此问题,您必须访问t.exec(a)[2]。 Ted Hopp解决这个问题的解决方案就是你想要做的。