2015-06-22 48 views
4

我已經找到了exec方法最好的地方是雄辯的Javascript第9章:請有人能幫我理解正則表達式的exec方法嗎?

「正則表達式也有一個exec(執行)方法,將返回null如果沒有匹配,並與有關的信息返回一個對象從exec返回的對象有一個索引屬性,告訴我們在字符串中成功匹配開始的位置,除此之外,對象看起來像(實際上是)一個字符串數組,其第一個元素是字符串被匹配......「

到目前爲止,這是有道理的,但隨後變得有點混亂:

」當正EXPRES sion包含用括號分組的子表達式,與這些組相匹配的文本也將顯示在數組中。整場比賽始終是第一要素。「

好的,但...

」的下一個元素是由第一組(其開口括號至上表達式中的一個)一致的部分,則第二組,以此類推。」

var quotedText = /'([^']*)'/; 
console.log(quotedText.exec("she said 'hello'")); 
// → ["'hello'", "hello"] 

我的困惑是,在這個例子中,重複囉。我不明白爲什麼它會2個打着招呼給我回來嗎?

然後將題目是由以下包裝:

「當一個組完全沒有最終匹配(例如,後面跟着一個問號)時,它在輸出數組中的位置將保持未定義狀態。同樣地,當一組匹配多次,只有最後一場比賽在數組中結束了。」

console.log(/bad(ly)?/.exec("bad")); 
// → ["bad", undefined] 
console.log(/(\d)+/.exec("123")); 
// → ["123", "3"] 

這最後一句話,並例子讓我困惑....

任何光棚上本就非常感謝!

+1

一個比賽,一個用於捕獲 –

+0

*」我不我不明白爲什麼它會給我兩個hellos回來嗎?「*表達式包含一個捕獲組,它偶然捕獲整個匹配,因此你得到相同的值兩次 –

+0

@FelixKling'該表達式包含一個捕獲組,它偶然捕獲整個匹配'錯,首先匹配''你好'2,抓住'你好'(不含引號) –

回答

7

我不明白爲什麼它會給我兩個打着招呼回來嗎?

因爲數組中的第一項是總體匹配表達式,然後跟隨表達式定義的任何捕獲組的內容。由於該表達式定義了一個捕獲組,因此您會返回兩個條目。因爲在正則表達式中,只有hello位於捕獲組(圓括號)中,而'位於其外部:

 
vvvvvvvvv----- Overall expression 
/'([^']*)'/ 
    ^^^^^^^------ Capture group 

讓我們來看看這/bad(ly)?/例如:什麼它說的是「匹配bad可選其次ly,捕捉ly,如果它的存在。「所以,你得到:

console.log(/bad(ly)?/.exec("bad")); 
// -> ["bad", undefined] 
// ^ ^
//  |  +--- first capture group has nothing in it 
//  +---------- overall match is "bad" 
console.log(/bad(ly)?/.exec("badly")); 
// -> ["badly", "ly"] 
// ^ ^
//  |  +- first capture group has "ly" 
//  +---------- overall match is "badly" 

假設我們把個人的捕捉組的ly,使兩者可選:

console.log(/bad(l)?(y)?/.exec("bad")); 
// -> ["bad", undefined, undefined] 
// ^ ^  ^
//  |  |   +--- Nothing in the second capture group 
//  |  +-------------- Nothing in the first capture group 
//  +--------------------- Overall match is "bad" 
console.log(/bad(l)?(y)?/.exec("badly")); 
// -> ["badly", "l", "y"] 
// ^ ^^
//  |  | +------- Second capture group has "y" 
//  |  +------------ First capture group has "l" 
//  +--------------------- Overall match is "badly" 
console.log(/bad(l)?(y)?/.exec("badl")); 
// -> ["badl", "l", undefined] 
// ^ ^^
//  |  | +-------- Second capture group has nothing in it 
//  |  +------------- First capture group has "l" 
//  +--------------------- Overall match is "badl" 
console.log(/bad(l)?(y)?/.exec("bady")); 
// -> ["bady", undefined, "y"] 
// ^ ^  ^
//  |  |   +-- Second capture group has "y" 
//  |  +------------- First capture group has nothing in it 
//  +--------------------- Overall match is "bady" 
+0

超級簡潔而翔實!然而,只是另一件事......在這個例子中,爲什麼圓括號對數字符號(\ d)有所不同, 。他們的角色是什麼? – Anna

+0

@安娜:在這個表達中,他們基本上沒有任何意義。沒有他們的表達,使用完全匹配的結果,表達所做的一切。 –

相關問題