一個(gè) RegExp 對(duì)象包含一個(gè)正則表達(dá)式和關(guān)聯(lián)的標(biāo)志。
正則表達(dá)式的格式和功能是以 Perl 5 程序語言的正則表達(dá)式設(shè)施為藍(lán)本的。
RegExp 構(gòu)造器對(duì)輸入模式字符串應(yīng)用以下文法。如果文法無法將字符串解釋為 Pattern 的一個(gè)展開形式,則發(fā)生錯(cuò)誤。
語法:
Pattern :: Disjunction
Disjunction :: Alternative Alternative | Disjunction
Alternative :: [empty] Alternative Term
Term :: Assertion Atom Atom Quantifier
Assertion :: ^ $ \ b \ B ( ? = Disjunction ) ( ? ! Disjunction )
Quantifier :: QuantifierPrefix QuantifierPrefix ?
QuantifierPrefix :: * + ? { DecimalDigits } { DecimalDigits , } { DecimalDigits , DecimalDigits }
Atom :: PatternCharacter . \ AtomEscape CharacterClass ( Disjunction ) ( ? : Disjunction )
PatternCharacter :: SourceCharacter but not any of: ^ $ \ . * + ? ( ) [ ] { } |
AtomEscape :: DecimalEscape CharacterEscape CharacterClassEscape
CharacterEscape :: ControlEscape c ControlLetter HexEscapeSequence UnicodeEscapeSequence IdentityEscape
ControlEscape :: one of f n r t v
ControlLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
IdentityEscape :: SourceCharacter but not IdentifierPart
DecimalEscape :: DecimalIntegerLiteral [lookahead ? DecimalDigit]
CharacterClassEscape :: one of d D s S w W
CharacterClass :: [ [lookahead ? {^}] ClassRanges ] [ ^ ClassRanges ]
ClassRanges :: [empty] NonemptyClassRanges
NonemptyClassRanges :: ClassAtom ClassAtom NonemptyClassRangesNoDash ClassAtom - ClassAtom ClassRanges
NonemptyClassRangesNoDash :: ClassAtom ClassAtomNoDash NonemptyClassRangesNoDash ClassAtomNoDash - ClassAtom ClassRanges
ClassAtom :: - ClassAtomNoDash
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or - \ ClassEscape
ClassEscape :: DecimalEscape b CharacterEscape CharacterClassEscape
使用下面描述的過程來將一個(gè)正則表達(dá)式模式轉(zhuǎn)換為一個(gè)內(nèi)部程序。實(shí)現(xiàn)使用比下面列出的算法跟高效的算法是被鼓勵(lì)的,只要結(jié)果是相同的。內(nèi)部程序用作 RegExp 對(duì)象的 [[Match]] 內(nèi)部屬性的值。
后面的描述用到以下變量:
此外,后面的描述用到以下內(nèi)部數(shù)據(jù)結(jié)構(gòu):
產(chǎn)生式 Pattern :: Disjunction 按照以下方式解釋執(zhí)行 :
一個(gè)模式解釋執(zhí)行(“編譯”)為一個(gè)內(nèi)部程序值。RegExp.prototype.exec 可將這個(gè)內(nèi)部程序應(yīng)用于一個(gè)字符串和字符串的一個(gè)偏移位,來確定從這個(gè)偏移位開始 , 模式是否能夠匹配,如果能匹配,將返回捕獲括號(hào)的值。15.10.2 中的算法被設(shè)計(jì)為只在編譯一個(gè)模式時(shí)可拋出一個(gè) SyntaxError 異常;反過來說,一旦模式編譯成功,應(yīng)用編譯生成的內(nèi)部程序在字符串中尋找匹配結(jié)果時(shí)不可拋出異常(除非是宿主定義的可在任何時(shí)候出現(xiàn)的異常,如內(nèi)存不足)。
產(chǎn)生式 Disjunction :: Alternative 的解釋執(zhí)行,是解釋執(zhí)行 Alternative 來獲得 Matcher 并返回這個(gè) Matcher。
產(chǎn)生式 Disjunction :: Alternative | Disjunction 按照以下方式解釋執(zhí)行:
正則表達(dá)式運(yùn)算符 | 用來分隔兩個(gè)選擇項(xiàng)。模式首先嘗試去匹配左側(cè)的 Alternative( 緊跟著是正則表達(dá)式的后續(xù)匹配結(jié)果 );如果失敗,嘗試匹配右側(cè)的 Disjunction(緊跟著是正則表達(dá)式的后續(xù)匹配結(jié)果)。如果左側(cè)的 Alternative,右側(cè)的 Disjunction,還有后續(xù)匹配結(jié)果,全都有可選的匹配位置,則后續(xù)匹配結(jié)果的所有可選位置是在左側(cè)的 Alternative 移動(dòng)到下一個(gè)可選位置之前確定的。如果左側(cè) Alternative 的可選位置被用盡了,右側(cè) Disjunction 試圖替代左側(cè) Alternative。一個(gè)模式中任何被 | 跳過的捕獲括號(hào)參數(shù) undefined 值還代替字符串。因此,如:
/a|ab/.exec("abc")
返回結(jié)果是 "a",而不是 "ab"。此外
/((a)|(ab))((c)|(bc))/.exec("abc")
返回的數(shù)組是
["abc", "a", "a", undefined, "bc", undefined, "bc"]
而不是
["abc", "ab", undefined, "ab", "c", "c", undefined]
產(chǎn)生式 Alternative :: [empty] 解釋執(zhí)行返回一個(gè) Matcher,它需要兩個(gè)參數(shù),一個(gè) State x 和 一個(gè) Continuation c,并返回調(diào)用 c(x) 的結(jié)果。
產(chǎn)生式 Alternative :: Alternative Term 按照如下方式解釋執(zhí)行:
連續(xù)的 Term 試著同時(shí)去匹配連續(xù)輸入字符串的連續(xù)部分。如果左側(cè)的 Alternative,右側(cè)的 Term,還有后續(xù)匹配結(jié)果,全都有可選的匹配位置,則后續(xù)匹配結(jié)果的所有可選位置是在右側(cè)的 Term 移動(dòng)到下一個(gè)可選位置之前確定的,并且則右側(cè)的 Term 的所有可選位置是在左側(cè)的 Alternative 移動(dòng)到下一個(gè)可選位置之前確定的。
產(chǎn)生式 Term :: Assertion 解釋執(zhí)行,返回一個(gè)需要兩個(gè)參數(shù) State x 和 Continuation c 的內(nèi)部閉包 Matcher,它的執(zhí)行方式如下:
產(chǎn)生式 Term :: Atom 的解釋執(zhí)行方式是,解釋執(zhí)行 Atom 來獲得一個(gè) Matcher 并返回這個(gè) Matcher。
產(chǎn)生式 Term :: Atom Quantifier 的解釋執(zhí)行方式如下 :
抽象操作 RepeatMatcher 需要八個(gè)參數(shù),一個(gè) Matcher m, 一個(gè)整數(shù) min, 一個(gè)整數(shù) ( 或 ∞) max, 一個(gè)布爾值 greedy, 一個(gè) State x, 一個(gè) Continuation c, 一個(gè)整數(shù) parenIndex, 一個(gè)整數(shù) parenCount, 執(zhí)行方式如下 :
一個(gè)Atom后跟Quantifier是用Quantifier指定重復(fù)的次數(shù)。Quantifier可以是非貪婪的,這種情況下Atom模式在能夠匹配序列的情況下盡可能重復(fù)少的次數(shù), 或者它可以使貪婪的,這種情況下Atom模式在能夠匹配序列的情況下盡可能重復(fù)多的次數(shù),Atom模式重復(fù)的是他自己而不是它匹配的字符串,所以不同次的重復(fù)中Atom可以匹配不同的子串。
假如Atom和后續(xù)的正則表達(dá)式都有選擇余地,Atom首先盡量多匹配(或者盡量少,假如是非貪婪模式)在最后一次Atom的重復(fù)中移動(dòng)到下一個(gè)選擇前,所有的后續(xù)中的選項(xiàng)<都應(yīng)該被嘗試。 在倒數(shù)第二次(第n–1次)Atom的重復(fù)中移動(dòng)到下一個(gè)選擇前,所有Atom的選項(xiàng)在最后一次(第n次)重復(fù)中應(yīng)該被嘗試。這樣可以得出更多或者更少的重復(fù)次數(shù)可行。 這些情況在開始匹配下一個(gè)選項(xiàng)的第(n-1)次重復(fù)時(shí)已經(jīng)被窮舉,以此類推。
比較
/a[a-z]{2,4}/.exec("abcdefghi")
它返回"abcde"而
/a[a-z]{2,4}?/.exec("abcdefghi")
它返回"abc".
再考慮
/(aa|aabaac|ba|b|c)*/.exec("aabaac")
按照上面要求的選擇數(shù),它返回
["aaba", "ba"]
而非以下:
["aabaac", "aabaac"] ["aabaac", "c"]
上面要求的選擇數(shù)可以用來編寫一個(gè)計(jì)算兩個(gè)數(shù)最大公約數(shù)的正則表達(dá)式(用單一字符重復(fù)數(shù)表示). 以下實(shí)例用來計(jì)算10和15的最大公約數(shù):
"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/,"$1")
它返回最大公約數(shù)的單一字符重復(fù)數(shù)表示"aaaaa".
RepeatMatcher的步驟4 每重復(fù)一次就清除Atom的捕獲。我們可以看到它在正則表達(dá)式中的行為:
/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")
它返回?cái)?shù)組
["zaacbbbcac", "z", "ac", "a", undefined, "c"]
而非
["zaacbbbcac", "z", "ac", "a", "bbb", "c"]
因?yàn)樽钔饷娴?每次迭代都會(huì)清除所有括起來的Atom中所含的捕獲字符串,在這個(gè)例子中就是包含編號(hào)為2,3,4,5的捕獲字符串。
RepeatMatcher的d閉包狀態(tài)步驟1,一旦重復(fù)的最小次數(shù)達(dá)到,任何Atom匹配空String的擴(kuò)展不再會(huì)匹配到重復(fù)中。這可以避免正則引擎在匹配類似下面的模式時(shí)掉進(jìn)無限循環(huán):
/(a*)*/.exec("b")
或者稍微復(fù)雜一點(diǎn):
/(a*)b\1+/.exec("baaaac")
它返回?cái)?shù)組:
["b", ""]
產(chǎn)生式Assertion :: ^ 解釋執(zhí)行返回一個(gè) AssertionTester , 它需要1個(gè)參數(shù) State x,并按如下算法執(zhí)行:
產(chǎn)生式Assertion :: $ 解釋執(zhí)行返回一個(gè) AssertionTester , 它需要1個(gè)參數(shù) State x,并按如下算法執(zhí)行:
產(chǎn)生式Assertion :: \ b 解釋執(zhí)行返回一個(gè) AssertionTester , 它需要1個(gè)參數(shù) State x,并按如下算法執(zhí)行:
產(chǎn)生式Assertion :: \ B 解釋執(zhí)行返回一個(gè) AssertionTester , 它需要1個(gè)參數(shù) State x,并按如下算法執(zhí)行:
產(chǎn)生式Assertion :: (? = Disjunction) 按如下算法執(zhí)行:
產(chǎn)生式Assertion :: (? ! Disjunction) 按如下算法執(zhí)行:
抽象操作 IsWordChar ,擁有一個(gè)integer類型的參數(shù)e,按如下方式執(zhí)行:
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _
產(chǎn)生式 Quantifier :: QuantifierPrefix 按如下方式執(zhí)行:
產(chǎn)生式 Quantifier :: QuantifierPrefix ? 按如下方式執(zhí)行:
產(chǎn)生式 Quantifier :: * 返回 0 和 ∞
產(chǎn)生式 Quantifier :: + 返回 1 和 ∞
產(chǎn)生式 Quantifier :: ? 返回 0 和 1
產(chǎn)生式 Quantifier :: { DecimalDigits } 按如下方式執(zhí)行:
產(chǎn)生式 Quantifier :: { DecimalDigits, } 按如下方式執(zhí)行:
產(chǎn)生式 Quantifier :: { DecimalDigits, DecimalDigits} 按如下方式執(zhí)行:
產(chǎn)生式 Atom :: PatternCharacter 執(zhí)行方式如下:
產(chǎn)生式 Atom :: . 執(zhí)行方式如下:
產(chǎn)生式 Atom :: \ AtomEscape 通過執(zhí)行 AtomEscape 返回 Matcher。
產(chǎn)生式 Atom :: CharacterClass 執(zhí)行方式如下:
產(chǎn)生式 Atom :: ( Disjunction ) 執(zhí)行方式如下:
產(chǎn)生式 Atom :: ( ? : Disjunction ) 通過執(zhí)行Disjunction 得到并返回一個(gè)Matcher。
抽象操作 CharacterSetMatcher ,擁有2個(gè)參數(shù):一個(gè) CharSet A 和 Boolean invert標(biāo)志,按如下方式執(zhí)行:
抽象操作 Canonicalize,擁有一個(gè)字符參數(shù) ch,按如下方式執(zhí)行:
( Disjunction ) 的括號(hào) 用來組合 Disjunction 模式,并保存匹配結(jié)果。該結(jié)果可以通過后向引用(一個(gè)非零數(shù),前置\),在一個(gè)替換字符串中的引用,或者作為正則表達(dá)式內(nèi)部匹配過程的部分結(jié)果。使用(?: Disjunction )來避免括號(hào)的捕獲行為。
(? = Disjunction )指定一個(gè)零寬正向預(yù)查。為了保證匹配成功,其 Disjunction 必須首先能夠匹配成功,但在匹配后續(xù)字符前,其當(dāng)前位置會(huì)不變。如果 Disjunction 能在當(dāng)前位置以多種方式匹配,那么只會(huì)取第一次匹配的結(jié)果。不像其他正則表達(dá)式運(yùn)算符,(?= 內(nèi)部不會(huì)回溯(這個(gè)特殊的行為是從Perl繼承過來的)。在 Disjunction 含有捕獲括號(hào),模式的后續(xù)字符包括后向引用時(shí)匹配結(jié)果會(huì)有影響。
例如,
/(?=(a+))/.exec("baaabac")
會(huì)匹配第一個(gè)b后的空白字符串,得到:
["", "aaa"]
為了說明預(yù)查不會(huì)回溯,
/(?=(a+))a*b\1/.exec("baaabac")
得到:
["aba", "a"]
而不是:
["aaaba", "a"]
(?! Disjunction ) 指定一個(gè)零寬正向否定預(yù)查。為了保證匹配成功,其 Disjunction 必須首先能夠匹配失敗,但在匹配后續(xù)字符前,其當(dāng)前位置會(huì)不變。Disjunction 能含有捕獲括號(hào),但是對(duì)這些捕獲分組的后向引用只在Disjunction中有效。在當(dāng)前模式的其他位置后向引用捕獲分組都會(huì)返回undefined。因?yàn)榉穸A(yù)查必須滿足預(yù)查失敗來保證模式成功匹配。例如,
/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")
搜索a,其后有n個(gè)a,一個(gè)b,n個(gè)a(\2指定)和一個(gè)c。第二個(gè)\2位于負(fù)向預(yù)查模式的外部,因此它匹配undefined,且總是成功的。整個(gè)表達(dá)式返回一個(gè)數(shù)組:
["baaabaac", "ba", undefined, "abaac"]
在發(fā)生比較前,一次不區(qū)分大小寫的匹配中所有的字符都會(huì)隱式轉(zhuǎn)換為大寫。然而,如果某些單個(gè)字符在轉(zhuǎn)換為大寫時(shí)擴(kuò)展為多個(gè)字符,那么該字符會(huì)保持原樣。當(dāng)某些非ASCII字符在轉(zhuǎn)換為大寫時(shí)變成ASCII字符,該字符也會(huì)保持原樣。這樣會(huì)阻止Unicode字符(例如\u0131和\u017F)匹配正則表達(dá)式 (例如僅匹配ASCII字符的正則表達(dá)式/[a z]/i)。而且,如果轉(zhuǎn)換允許,/[^\W]/i會(huì)匹配除去i或s外的每一個(gè)a,b,......,h。
產(chǎn)生式 AtomEscape :: DecimalEscape 執(zhí)行方式如下:
產(chǎn)生式 AtomEscape :: CharacterEscape 執(zhí)行方式如下:
產(chǎn)生式 AtomEscape :: CharacterClassEscape 執(zhí)行方式如下:
格式\后為非零數(shù)n的轉(zhuǎn)義序列匹配捕獲分組的第n次匹配結(jié)果。如果正則表達(dá)式少于n個(gè)捕獲括號(hào),會(huì)報(bào)錯(cuò)。如果正則表達(dá)式大于等于n個(gè)捕獲括號(hào),由于沒有捕獲到任何東西,導(dǎo)致第n個(gè)捕獲分組結(jié)果為undefined,那么后向引用總是成功的。
產(chǎn)生式 CharacterEscape :: ControlEscape 執(zhí)行返回一個(gè)根據(jù)表23定義的字符:
ControlEscape字符轉(zhuǎn)義值ControlEscape | 字符編碼值 | 名稱 | 符號(hào) |
---|---|---|---|
t | \u0009 | 水平制表符 | <HT> |
n | \u000A | 進(jìn)行(新行) | <LF> |
v | \u000B | 豎直制表符 | <VT> |
f | \u000C | 進(jìn)紙 | <FF> |
r | \u000D | 回車 | <CR> |
產(chǎn)生式 CharacterEscape :: ch ControlLetter 執(zhí)行過程如下:
產(chǎn)生式 CharacterEscape :: HexEscapeSequence 執(zhí)行HexEscapeSequence的CV,返回其字符結(jié)果。
產(chǎn)生式 CharacterEscape :: UnicodeEscapeSequence 執(zhí)行UnicodeEscapeSequence的CV,返回其字符結(jié)果。
產(chǎn)生式 CharacterEscape :: IdentityEscape執(zhí)行返回由IdentityEscape表示的字符。
產(chǎn)生式 DecimalEscape :: DecimalIntegerLiteral [lookahead ? DecimalDigit] 按如下方式執(zhí)行:
“the MV of DecimalIntegerLiteral”在7.8.3節(jié)定義。
如果\后面是一個(gè)數(shù)字,且首位為0,那么,該轉(zhuǎn)義序列被認(rèn)為是一個(gè)后向引用。如果n比在整個(gè)正則表達(dá)式左捕獲括號(hào)個(gè)數(shù)大,那么會(huì)出錯(cuò)。\0 表示 <NUL>字符,其后不能再有數(shù)字。
產(chǎn)生式 CharacterClassEscape :: d執(zhí)行返回包含0到9之間的十元素字符集。
產(chǎn)生式 CharacterClassEscape :: D執(zhí)行返回不包括 CharacterClassEscape :: d的字符集。
產(chǎn)生式 CharacterClassEscape :: s執(zhí)行返回包含 WhiteSpace 或 LineTerminator 產(chǎn)生式右部分字符的字符集。
產(chǎn)生式 CharacterClassEscape :: S執(zhí)行返回不包括 CharacterClassEscape :: s的字符集。
產(chǎn)生式 CharacterClassEscape :: w執(zhí)行返回包含如下63個(gè)字符的字符集:
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _
產(chǎn)生式 CharacterClassEscape :: W執(zhí)行返回不包括CharacterClassEscape :: w的字符集。
產(chǎn)生式 CharacterClass :: [ [lookahead ? {^}] ClassRanges ] 通過執(zhí)行ClassRanges獲得并返回這個(gè)CharSet和Boolean false。
產(chǎn)生式 CharacterClass :: [ ^ ClassRanges ] 通過執(zhí)行ClassRanges獲得并返回這個(gè)CharSet和Boolean true。
產(chǎn)生式 ClassRanges :: [empty]執(zhí)行返回一個(gè)空的CharSet。
產(chǎn)生式 ClassRanges :: NonemptyClassRanges 通過執(zhí)行 NonemptyClassRanges 獲得并返回這個(gè)CharSet。
產(chǎn)生式 NonemptyClassRanges :: ClassAtom 通過執(zhí)行ClassAtom獲得一個(gè)CharSet并返回這個(gè)CharSet。
產(chǎn)生式 NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash 按如下方式執(zhí)行:
產(chǎn)生式 NonemptyClassRanges :: ClassAtom - ClassAtom ClassRanges 按如下方式執(zhí)行:
抽象操作 CharacterRange,擁有2個(gè)CharSet參數(shù)A和B,執(zhí)行方式如下:
產(chǎn)生式NonemptyClassRangesNoDash :: ClassAtom 執(zhí)行過程是執(zhí)行ClassAtom產(chǎn)生一個(gè)CharSet并且返回這個(gè)CharSet。
產(chǎn)生式NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash 按以下方式執(zhí)行:
產(chǎn)生式NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassRanges 按以下方式執(zhí)行:
ClassRanges可以拆分成單獨(dú)的ClassAtom且/或兩個(gè)用減號(hào)分隔的ClassAtom。在后面的情況下ClassAtom包含第一個(gè)到第二個(gè)ClassAtom間的所有字符。 如果兩個(gè)ClassAtom之一不是表示一個(gè)單獨(dú)字符(例如其中一個(gè)是\w)或者第一個(gè)ClassAtom的字符編碼值比第二個(gè)ClassAtom的字符編碼值大則發(fā)生錯(cuò)誤。
即使匹配忽略大小寫,區(qū)間兩端的大小寫在區(qū)分哪些字符屬于區(qū)間時(shí)仍然有效。這意味著,例如模式/[E-F]/僅僅匹配E, F, e, 和 f。/[E-f]/i則匹配所有大寫和小寫的ASCII字母以及[, \, ], ^, _, 和 `
-字符可能被當(dāng)做字面意思或者表示一個(gè)區(qū)間,它作為ClassRange的開頭或者結(jié)尾、在區(qū)間指定開頭或者結(jié)尾,或者緊跟一個(gè)區(qū)間指定的時(shí)候被當(dāng)做字面意思。
產(chǎn)生式 ClassAtom :: - 執(zhí)行返回包含單個(gè)字符 - 的字符集。
產(chǎn)生式 ClassAtom :: ClassAtomNoDash 通過執(zhí)行 ClassAtomNoDash 獲得并返回這個(gè) CharSet。
產(chǎn)生式 ClassAtomNoDash :: SourceCharacter 不包括\,],- 執(zhí)行返回包含由 SourceCharacter 表示的字符的單元素字符集。
產(chǎn)生式 ClassAtomNoDash :: \ ClassEscape 通過執(zhí)行ClassEscape 得到并返回這個(gè)CharSet。
產(chǎn)生式 ClassEscape :: DecimalEscape 按如下方式執(zhí)行:
產(chǎn)生式 ClassEscape :: b 執(zhí)行返回包含一個(gè)<BS>字符(Unicode值0008)的字符集。
產(chǎn)生式 ClassEscape :: CharacterEscape 通過執(zhí)行 CharacterEscape 獲得一個(gè)字符Charset并返回包含該字符的單元素字符集CharSet。
產(chǎn)生式 ClassEscape :: CharacterClassEscape 通過執(zhí)行 CharacterClassEscape 獲得并返回這個(gè)CharSet。
ClassAtom 可以使用除\b,\B,后向引用外的轉(zhuǎn)義序列。在CharacterClass中,\b表示退格符。然而,\B和后向引用會(huì)報(bào)錯(cuò)。同樣,在一個(gè)ClassAtom中使用后向引用會(huì)報(bào)錯(cuò)。
如果pattern是一個(gè)對(duì)象R,其內(nèi)部屬性[[Class]]為 RegExp且flags 為undefined,返回R。否則,調(diào)用內(nèi)置RegExp構(gòu)造器,通過表達(dá)式 new RegExp(pattern,flags)返回由該構(gòu)造器構(gòu)造的對(duì)象。
當(dāng)RegExp作為 new 表達(dá)式一部分調(diào)用時(shí),它是一個(gè)構(gòu)造器,用來初始化一個(gè)新創(chuàng)建的對(duì)象。
如果 pattern 是一個(gè)對(duì)象R,其內(nèi)部 [[CLASS]] 屬性為RegExp,且 flags 為 undefined,那么,令 P 為 pattern 和令 F 為 flags 用來構(gòu)造 R。如果pattern是一個(gè)對(duì)象R,其內(nèi)部[[CLASS]]屬性為RegExp,且flags為undefined,那么,拋出TypeError異常。否則,如果pattern為undefined且ToString(pattern),令P為空的字符串;如果flags為undefined且ToString(flags)令F為空字符串。
如果字符P不滿足Pattern語義,那么拋出SyntaxError異常。否則,令新構(gòu)造的對(duì)象擁有內(nèi)部[[Match]]屬性,該屬性通過執(zhí)行(編譯)字符P作為在15.10.2節(jié)描述的Pattern。
如果F含有除“g”,“i”,“m”外的任意字符,或者F中包括出現(xiàn)多次的字符,那么,拋出SyntaxError異常。
如果SyntaxError異常未拋出,那么:
令S為一個(gè)字符串,其等價(jià)于P表示的Pattern,S中的字符按如下描述進(jìn)行轉(zhuǎn)義。這樣,S可能或者不會(huì)與P或者pattern相同;然而,由執(zhí)行S作為一個(gè)Pattern的內(nèi)部處理程序必須和通過構(gòu)造對(duì)象的內(nèi)部[[Match]]屬性的內(nèi)部處理程序完全相同。
如果pattern里存在字符/或者\(yùn),那么這些字符應(yīng)該被轉(zhuǎn)義,以確保由“/”,S,“/”構(gòu)成的的字符串的S值有效,而且F能被解析(在適當(dāng)?shù)脑~法上下文中)為一個(gè)與構(gòu)造的正則表達(dá)式行為完全相同的 RegularExpressionLiteral 。例如,如果P是“/”,那么S應(yīng)該為“\/”或“\u002F”,而不是“/”,因?yàn)镕后的 /// 會(huì)被解析為一個(gè) SingleLineComment,而不是一個(gè) RegularExpressionLiteral。 如果P為空字符串,那么該規(guī)范定義為令S為“(?:)”。
這個(gè)新構(gòu)造對(duì)象的如下屬性為數(shù)據(jù)屬性,其特性在15.10.7中定義。各屬性的[[Value]]值按如下方式設(shè)置:
其source屬性置為S。
其global屬性置為一個(gè)Boolean值。當(dāng)F含有字符g時(shí),為true,否則,為false。
其ignoreCase屬性置為一個(gè)Boolean值。當(dāng)F含有字符i時(shí),為true,否則,為false。
其multiline屬性置為一個(gè)Boolean值。當(dāng)F含有字符m時(shí),為true,否則,為false。
其lastIndex屬性置為0。
其內(nèi)部[[Prototype]]屬性置為15.10.6中定義的內(nèi)置RegExp原型對(duì)象。
其內(nèi)部[[Class]]屬性置為“RegExp”。
如果pattern為 StringLiteral,一般的轉(zhuǎn)義字符替換發(fā)生在被RegExp處理前。如果pattern必須含有RegExp識(shí)別的轉(zhuǎn)義字符,那么當(dāng)構(gòu)成 StringLiteral的內(nèi)容時(shí),為了防止被移除\被移除,在 StringLiteral中的任何\必須被轉(zhuǎn)義
RegExp構(gòu)造器的[[Prototype]]值為內(nèi)置Function的原型(15.3.4)。
除了內(nèi)部的一些屬性和length屬性(其值為2),RegExp構(gòu)造器還有如下屬性:
RegExp.prototype的初始值為RegExp的原型(15.10.6)。
該屬性有這些特性: { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
RegExp的原型的內(nèi)部[[Prototype]]屬性為Object的原型(15.2.4)。RegExp的原型為其本身的一個(gè)普通的正則表達(dá)式對(duì)象;它的[[Class]]為“RegExp”。RegExp的原型對(duì)象的數(shù)據(jù)式屬性的初始值被設(shè)置為仿佛由內(nèi)置RegExp構(gòu)造器深生成的表達(dá)式new RegExp()創(chuàng)建的對(duì)象。
RegExp的原型本身沒有valueOf屬性;然而,該valueOf屬性是繼承至Object的原型。
在作為RegExp原型對(duì)象的屬性的如下函數(shù)描述中,“this RegExp object”是指函數(shù)激活時(shí)this對(duì)象;如果this值不是一個(gè)對(duì)象,或者一個(gè)其內(nèi)部[[Class]]屬性值不是“RegExp”的對(duì)象,那么一個(gè)TypeError會(huì)拋出。
RegExp.prototype.constructor 的初始值為內(nèi)置 RegExp 構(gòu)造器。
Performs a regular expression match of string against the regular expression and returns an Array object containing the results of the match, or null if string did not match.
The String ToString(string) is searched for an occurrence of the regular expression pattern as follows:
采用如下步驟:
返回一個(gè)String,由“/”,RegExp對(duì)象的source屬性值,“/”與“g”(如果global屬性為true),“i”(如果ignoreCase為true),“m”(如果multiline為true)通過連接組成。
如果返回的字符串包含一個(gè)RegularExpressionLiteral,那么該RegularExpressionLiteral用同樣的方式解釋執(zhí)行。
RegExp實(shí)例繼承至RegExp原型對(duì)象,其[[CLASS]]內(nèi)部屬性值為“RegExp”。RegExp實(shí)例也擁有一個(gè)[[Match]]內(nèi)部屬性和一個(gè)length屬性。
內(nèi)部屬性[[Match]]的值是正則表達(dá)式對(duì)象的Pattern的依賴實(shí)現(xiàn)的表示形式。
RegExp實(shí)例還有如下屬性。
source屬性為構(gòu)成正則表達(dá)式Pattern的字符串。該屬性擁有這些特性{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
global屬性是一Boolean值,表示正則表達(dá)式flags是否有“g”。該屬性擁有這些特性{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
ignoreCase屬性是一Boolean值,表示正則表達(dá)式flags是否有“i”。該屬性擁有這些特性{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
multiline屬性是一Boolean值,表示正則表達(dá)式flags是否有“m”。該屬性擁有這些特性{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
lastIndex屬性指定從何處開始下次匹配的一個(gè)字符串類型的位置索引。當(dāng)需要時(shí)該值會(huì)轉(zhuǎn)換為一個(gè)整型數(shù)。該屬性擁有這些特性{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。
不同于其他RegExp實(shí)例內(nèi)置屬性,lastIndex是可寫的。
更多建議: