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