2014-10-05 38 views
0

我在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」,如果你輸入「我的名字是Bob」你「HI未定義」,當我在正則表達式中放置了「I AM(。*)」,然後導致未定義。

那麼,爲什麼這個正則表達式完全在if語句中工作,但只有exec()中的前半部分?我怎麼修復它?

PS(使用EXEC(一)[0],則返回 「HI我是Bob」)

+0

所以'exec(a)[0]'工作?這不是回答你的問題嗎? – 2014-10-05 01:54:22

+0

@Scott Hunter沒有,因爲它只是應該返回名稱和單詞嗨。 – 2014-10-05 02:01:13

回答

4

嘗試使用圍繞|操作者和因子出(.*)捕獲組括號。您可以使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) 
} 
+0

我認爲這可能是這樣的!但是,它本身並不會幫助我,但感謝您的偉大答案! – 2014-10-05 02:07:04

0

RegExp.prototype.exec返回一個包含每個捕獲括號匹配的文本,然後一個項目的數組。

  • 在 「我是BOB」:

    • t.exec(a)回報["I AM BOB", "BOB", undefined]。它返回未定義,因爲第二個捕獲括號沒有捕獲任何東西。

  • 「我的名字是Bob」:

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

要解決它,你就必須交流電話t.exec(a)[2]。 Ted Hopp解決這個問題的方法是你想要做的。

相關問題