我在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”)
答案 0 :(得分:4)
尝试在|
运算符周围使用parens,并将(.*)
捕获组分解出来。您可以使用?:
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解决这个问题的解决方案就是你想要做的。