2014-10-05 3 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) 
    } 

И если вы вводите «Я ЕСМЬ ЛПП» вы получите «HI ЛПП», и если вы вводите «MY NAME IS BOB» вы получите «HI неопределенными», когда Я поставил «Я ЕСМЬ (. *)» Второй в регулярном выражении, и это также приведет к неопределенному.

Так почему же это регулярное выражение работает полностью в инструкции if, но только в первом тайме exec()? И как я могу это исправить?

Ps (используя Exec (а) [0] просто возвращает "HI MY NAME IS ЛПП")

+0

Итак, 'exec (a) [0]' работал? Разве это не отвечает на ваш вопрос? –

+0

@Scott Hunter Нет, потому что он должен только вернуть имя и слово hi. –

ответ

4

Попробуйте использовать скобки вокруг | оператора и фактора из группы (.*) захвата. Вы можете сделать или группа не-группа записи с ?::

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

EDIT: Причина, исходный код не является то, что с "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

Я думал, что это может быть что-то вроде этого! Но сам по себе это не помогло бы мне, а спасибо за отличный ответ! –

0

RegExp.prototype.exec возвращает массив, содержащий согласованный текст, а затем один элемент для каждого сохраняющих круглых скобок.

  • На "Я ЛПП":

    • t.exec(a) возвращается ["I AM BOB", "BOB", undefined]. Он возвращает undefined, потому что вторые скобки для захвата ничего не зафиксировали.

  • На "МОЕ ИМЯ ЛПП":

    • t.exec(a) возвращает ["MY NAME IS BOB", undefined, "BOB"]

Чтобы исправить это вы должны переменного тока cess t.exec(a)[2]. Решение Теда Хоппа исправить это то, что вы хотите сделать.

Смежные вопросы