匹配模式指的是一些可以改變正則表達式匹配行為的選項或修飾符。不同的語言支持的匹配模式不同,使用的方式也不同。
一般可分為全局和內聯兩種。下面主要介紹.NET中的匹配模式,其它語言的匹配模式,後續視情況補充。
.NET中的全局匹配模式是通過RegexOptions 枚舉值指定的,可以按位“或”進行組合,全局匹配模式只能作用於整個正則表達式。全局匹配模式提供的模式更多,可以靈活的動態指定匹配模式。
而內聯匹配模式是通過在正則表達式中,使用(?imnsx-imnsx:)或(?imnsx-imnsx)的分組構造來改變正則表達式的匹配行為的。內聯匹配模式更靈活、簡潔,但是提供的模式較少。
下表摘自MSDN,部分說明做了修改。
RegexOption 成員
內聯字符
說明
None
N/A
指定不設置任何選項。
IgnoreCase
i
指定不區分大小寫的匹配。
Multiline
m
指定多行模式。更改 ^ 和 $ 的含義,以使它們分別與任何行的開頭和結尾匹配,而不只是與整個字符串的開頭和結尾匹配。
ExplicitCapture
n
指定唯一有效的捕獲是顯式命名或編號的 (?<name>…) 形式的組。這允許圓括號充當非捕獲組,從而避免了由 (?:…) 導致的語法上的笨拙。
Compiled
N/A
指定正則表達式將被編譯為程序集。生成該正則表達式的 Microsoft 中間語言 (MSIL) 代碼;以較長的啟動時間為代價,得到更快的執行速度。
Singleline
s
指定單行模式。更改句點字符 (.) 的含義,以使它與每個字符(而不是除 \n 之外的所有字符)匹配。
IgnorePatternWhitespace
x
指定從模式中排除非轉義空白並啟用數字符號 (#) 後面的注釋。請注意,空白永遠不會從字符類中消除。
RightToLeft
N/A
指定搜索是從右向左而不是從左向右進行的。具有此選項的正則表達式將移動到起始位置的左邊而不是右邊。
ECMAScript
N/A
指定已為表達式啟用了符合 ECMAScript 的行為。此選項僅可與 IgnoreCase 和 Multiline 標志一起使用。將 ECMAScript 同任何其他標志一起使用將導致異常。
CultureInvariant
N/A
指定忽略語言中的區域性差異。
下面根據各種模式使用的頻率進行講解。
幾乎所有支持正則的語言中都提供了這一模式,是應用最多的模式之一,同時也是被“濫”用最多的模式之一。
開啟忽略大小寫模式,則字符可以同時匹配大寫或小寫形式。比如在此模式下,正則表達式“<br>”可同時匹配“<br>”和“<BR>”
但並不是所有的字符都有大小寫形式,所以在書寫的正則中,如果不存在可區分大小寫形式的元字符或是字符序列時,開啟這一模式是沒有任何意義的。
比如替換一般的html標簽的正則表達式
string result = Regex.Replace(srcStr, @"<[^>]*>", "", RegexOptions.IgnoreCase);
因為<[^>]*>沒有哪一個元字符或是字符序列具有大小寫形式,所以這裡的RegexOptions.IgnoreCase是多余的,用在這裡雖然不會改變匹配結果,但是會降低匹配效率,同時這也不是一個好的習慣。
只有在正則表達式中,注意是正則表達式中,而不是待匹配的源字符串中,涉及到大小寫形式的元字符或是字符序列時,才使用IgnoreCase模式。
多行模式改變的是“^”和“$”的匹配行為,使“^”和“$”不僅可以匹配整個字符串的開始和結束位置,還可以匹配每行的開始和結束位置。
首先說明一下“行”的范圍。雖然我們在程序中習慣用“\r\n”來表示換行,但實際上“\r”和“\n”是不相關的兩個字符,一個表示回車,一個表示換行。由於歷史原因,“\r”並不是所有系統都支持的,所以“行”是由“\n”來分割的,其中“\n”屬於前一“行”,而不屬於後一“行”。
舉例來說,字符串“a\r\nbc\r\n”共有三行,“a\r\n”為一行,“bc\r\n”為一行,最後還有一個“”空行。
“^”的匹配范圍
MatchCollection mc = Regex.Matches("a\r\nbc\r\n", @"^");
foreach (Match m in mc)
{
richTextBox2.Text += "匹配內容:" + m.Value + " 匹配開始索引:" + m.Index + " 匹配長度:" + m.Length + "\n";
}
/*--------輸出--------
匹配內容: 匹配開始索引:0 匹配長度:0
*/
“$”的匹配范圍
MatchCollection mc = Regex.Matches("a\r\nbc\r\n", @"$");
foreach (Match m in mc)
{
richTextBox2.Text += "匹配內容:" + m.Value + " 匹配開始索引:" + m.Index + " 匹配長度:" + m.Length + "\n";
}
/*--------輸出--------
匹配內容: 匹配開始索引:6 匹配長度:0
匹配內容: 匹配開始索引:7 匹配長度:0
*/
注意:這裡需要注意的是,在沒有開啟多行模式時,字符串結尾如果是“\n”,那麼“$”是可以匹配兩個位置的,一個是“\n”前的位置,一個是字符串結束位置。字符串結尾如果不是“\n”,那麼“$”就只匹配字符串結束位置。
MatchCollection mc = Regex.Matches("a\r\nbc\r", @"$");
foreach (Match m in mc)
{
richTextBox2.Text += "匹配內容:" + m.Value + " 匹配開始索引:" + m.Index + " 匹配長度:" + m.Length + "\n";
}
/*--------輸出--------
匹配內容: 匹配開始索引:6 匹配長度:0
*/
“^”的匹配范圍
MatchCollection mc = Regex.Matches("a\r\nbc\r\n", @"^", RegexOptions.Multiline);
foreach (Match m in mc)
{
richTextBox2.Text += "匹配內容:" + m.Value + " 匹配開始索引:" + m.Index + " 匹配長度:" + m.Length + "\n";
}
/*--------輸出--------
匹配內容: 匹配開始索引:0 匹配長度:0
匹配內容: 匹配開始索引:3 匹配長度:0
匹配內容: 匹配開始索引:7 匹配長度:0
*/
“$”的匹配范圍
MatchCollection mc = Regex.Matches("a\r\nbc\r\n", @"$", RegexOptions.Multiline);
foreach (Match m in mc)
{
richTextBox2.Text += "匹配內容:" + m.Value + " 匹配開始索引:" + m.Index + " 匹配長度:" + m.Length + "\n";
}
/*--------輸出--------
匹配內容: 匹配開始索引:2 匹配長度:0
匹配內容: 匹配開始索引:6 匹配長度:0
匹配內容: 匹配開始索引:7 匹配長度:0
*/
“^”匹配結果分析
在不開啟多行模式時,“^”只匹配字符串的開始位置,也就是位置0。
在開啟了多行模式後,“^”匹配字符串開始位置和每個“\n”之後的行起始位置。
“$”匹配結果分析
在不開啟多行模式時,如果字符結尾是“\n”,那麼“$”會匹配結尾“\n”之前和結束兩個位置。
在開啟多行模式後,“$”匹配每行“\n”之前的位置和字符串結束位置。
需要注意的是,在.NET中,無論是否開啟多行模式,“^”和“$”匹配的都只是一個位置,是零寬度的。其它語言中“^”和“$”的意義可能會有所不同。
只有在正則表達式中涉及到多行的“^”和“$”的匹配時,才使用Multiline模式。
典型應用一(參考 正則中加字符的問題):
需求描述:
fffffffffff
fffffffffff
dfdfdfdf
erererere
ferewfdfds
每行後面加一個“ttt”,即為
fffffffffffttt
fffffffffffttt
dfdfdfdfttt
ererererettt
ferewfdfdsttt
代碼實現:
string result = Regex.Replace(yourStr, @"^.*$", "$0ttt", RegexOptions.Multiline);
典型應用二
需求描述:
源字符串
CODE39/CODE93:
A-Z
space,-,.,$,/,+,%
CODE128A:
A-Z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗號,-,.,/, <,=,>,?,@,[,],^,_
CODE128B:
A-Z
a-z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗號,-,.,/, <,=,>,?,@,[,],^,_,{,},|,~
CODE2of5:
0-9
說明:
CODE128A:->條碼類別
A-Z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗號,-,.,/, <,=,>,?,@,[,],^,_->表示范圍
要求分別匹配出條碼類別和表示范圍
代碼實現:
MatchCollection mc = Regex.Matches(yourStr, @"(?<type>[^\n:]+):\s*(?<range>(^(?!\s*$).*$\n?)*)", RegexOptions.Multiline);
foreach (Match m in mc)
{
richTextBox2.Text += "條碼類別: \n" + m.Groups["type"].Value + "\n";
richTextBox2.Text += "表示范圍: \n" + m.Groups["range"].Value + "\n";
}
/*--------輸出--------
條碼類別:
CODE39/CODE93
表示范圍:
A-Z
space,-,.,$,/,+,%
條碼類別:
CODE128A
表示范圍:
A-Z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗號,-,.,/, <,=,>,?,@,[,],^,_
條碼類別:
CODE128B
表示范圍:
A-Z
a-z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗號,-,.,/, <,=,>,?,@,[,],^,_,{,},|,~
條碼類別:
CODE2of5
表示范圍:
0-9
*/
單行模式改變的是小數點“.”的匹配行為,使小數點可以匹配包含換行符“\n”在內的任意一個字符。
這是一個很不幸的命名,總讓人誤會它與Multiline多行模式是有關聯的,而事實上它改變的是小數點的匹配行為,與Multiline多行模式沒有任何關聯,由於歷史原因,這一不幸的命名被保留了下來。使用時需要注意。
單行模式通常在匹配有換行的文本時使用,采用小數點+單行模式的方式匹配任意字符,在.NET中是效率最高的。參考 正則基礎之——小數點。
典型應用:
源字符串:
<a>There is one obvious advantage:</a>
<div>
<p>
You've seen it coming!<br/>
Buy now and get nothing for free!<br/>
Well, at least no free beer. Perhaps a bear,<br/>
if you can afford it.
</p>
</div>
<a>Now that you've got...</a>
<div>
<p>
your bear, you have to admit it!<br/>
No, we aren't selling bears.
</p>
</div>
需求:取<div>標簽之間的內容
代碼實現:
MatchCollection mc = Regex.Matches(yourStr, @"<div[^>]*>(?:(?!</div\b).)*</div>", RegexOptions.Singleline|RegexOptions.IgnoreCase);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n-------------------\n";
}
/*--------輸出--------
<div>
<p>
You've seen it coming!<br/>
Buy now and get nothing for free!<br/>
Well, at least no free beer. Perhaps a bear,<br/>
if you can afford it.
</p>
</div>
-------------------
<div>
<p>
your bear, you have to admit it!<br/>
No, we aren't selling bears.
</p>
</div>
-------------------
*/
Compiled改變的是.NET中正則表達式的編譯方式。啟用了Compiled模式,會延長啟動時間,占用更多的內存,會提高匹配速度。當然,對最終性能的影響,需要根據具體問題綜合考慮的。這一模式也是被“濫”用最多的模式之一。
程序運行過程中,第一次遇到正則表達式,需要加載正則引擎,對正則表達式進行必要的語法檢查,並做適當的優化,最後把它轉換為適合正則引擎應用的形式。這種“解析”過程,對於復雜的正則表達式,頻繁調用或是匹配較大的數據源時,對效率的影響較大。
這時可以在構建正則表達式時開啟Compiled模式。這樣做會將正則表達式直接編譯為MSIL代碼,在正則匹配過程中,可以由JIT優化為更快的本地機器代碼,獲得更高的匹配速度。但這種方式會降低正則的解析速度,占用更多的內存,而且它占用的內存在程序運行過程中會一直占用,無法釋放。
什麼場景下使用Compiled模式,需要根據實際情況具體問題具體分析,一般來說,以下場景不適合使用Compiled模式:
RightToLeft改變的是正則表達式匹配的順序,從右到左進行匹配。目前只有.NET支持這一模式,但它對這一模式的支持並不是很完善,有時容易讓人費解,所以除非對源字符串的構成很了解,而且又不得不使用的情況,否則不要輕易使用這一模式。
典型應用(參考 求一個好的算法):
一個由字母組成的字符串,最長14位,要求每隔2位加一個逗號,最左邊不加,求一個好的算法
例:“abcdefg” 返回“a,bc,de,fg”
代碼實現:
string test = "abcdefg";
string result = Regex.Replace(yourStr, @"(?<!^)[a-zA-Z]{2}", ",$0", RegexOptions.RightToLeft);
這一模式指定不開啟任何模式。在.NET中RegexOptions 枚舉值是按位“或”組合,None模式我目前只找到一種應用場景,就是在動態生成正則表達式時,動態指定模式時使用。
/// <summary>
/// 動態生成正則參數列表
/// </summary>
/// <returns></returns>
private RegexOptions getParameter()
{
RegexOptions roList = RegexOptions.None;
if (cbIgnoreCase.Checked)
{
roList = roList | RegexOptions.IgnoreCase;
}
if (cbSingleline.Checked)
{
roList = roList | RegexOptions.Singleline;
}
if (cbMultiline.Checked)
{
roList = roList | RegexOptions.Multiline;
}
if (cbCompiled.Checked)
{
roList = roList | RegexOptions.Compiled;
}
if (cbRightToLelft.Checked)
{
roList = roList | RegexOptions.RightToLeft;
}
return roList;
}
這一模式改變的是普通捕獲組的匹配行為。將普通捕獲組解釋為非捕獲組,只有顯式命名的命名捕獲組才當作捕獲組使用。
捕獲組的作用是將括號()內子表達式匹配到的內容保存到內存中一個組裡,供以後引用,在.NET中捕獲組有兩種形式
(Expression) 普通捕獲組
(?<name>Expression) 命名捕獲組
其它形式的(?...)都不是捕獲組。
但是(Expression)這種捕獲組語法規則也帶來一個副作用,在一些不得不使用()的場合,會默認為使用了捕獲組,將匹配到的內容保存到內存中,而有些情況下這些內容並不需要關心的,浪費了系統資源,降低了匹配效率,所以才有了非捕獲組(?:Expression)的出現,來抵消這一副作用。而非捕獲組帶來的另一個副作用的就是可讀性的降低。
ExplicitCapture模式是為了在不犧牲匹配效率的前提下,提高正則表達式的可讀性,一般在命名捕獲組和普通捕獲組混合出現,而又不關心普通捕獲組的正則表達式中使用,如取鏈接和文字的正則表達式中
MatchCollection mc = Regex.Matches(yourStr, @"(?is)<a((?!href=).)*href=(?<s>['""]?)(?<url>[^""'\s>]*)\k<s>[^>]*>(?<text>((?!</a>).)*)</a>", RegexOptions.ExplicitCapture);
foreach (Match m in mc)
{
richTextBox2.Text += m.Groups["url"].Value + "\n";
richTextBox2.Text += m.Groups["text"].Value + "\n";
}
開啟ExplicitCapture模式對正則表達式解釋行為的影響,可以參考如下舉例,匹配時間的正則表達式
未開啟ExplicitCapture模式
string test = "<li title=\"截至2009-07-28 20:45:49,用戶的總技術分為:5988;截至2009-07-26日,用戶的總技術分排名為:4133\">(...)</li>";
Regex reg = new Regex(@"([01][0-9]|2[0-3])(:[0-5][0-9]){2}");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n";
richTextBox2.Text += m.Groups[1].Value + "\n";
richTextBox2.Text += m.Groups[2].Value + "\n";
}
/*--------輸出--------
20:45:49
20
:49
*/
開啟ExplicitCapture模式
string test = "<li title=\"截至2009-07-28 20:45:49,用戶的總技術分為:5988;截至2009-07-26日,用戶的總技術分排名為:4133\">(...)</li>";
Regex reg = new Regex(@"([01][0-9]|2[0-3])(:[0-5][0-9]){2}");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n";
richTextBox2.Text += m.Groups[1].Value + "\n";
richTextBox2.Text += m.Groups[2].Value + "\n";
}
/*--------輸出--------
20:45:49
*/
一般來說,關心的只是整個正則表達式匹配的整體,啟用了ExplicitCapture模式後,“([01][0-9]|2[0-3])”和“(:[0-5][0-9])”將不會被解釋為捕獲組,匹配到的內容也不會保存到內存中。
開啟ExplicitCapture模式雖然可以提高正則表達式的可讀性,但ExplicitCapture這一模式本身容易被人忽略,所以這種模式應用得也比較少。
一旦使用了ExplicitCapture模式,要注意的是,除非你清楚捕獲組的編號規則,否則盡量不要再使用\number方式進行反向引用,可以使用\k<name>方式進行反向引用。
Regex reg = new Regex(@"href=(['""]?)(?<url>[^'""\s>]+)\1", RegexOptions.ExplicitCapture);
MatchCollection mc = reg.Matches(yourStr);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n";
}
以上匹配鏈接的代碼通常是得不到任何結果的,因為這裡“\1”引用的內容,不再是“(['""]?)”匹配到的內容,而是“(?<url>[^'""\s>]+)”匹配到的內容,等價於“(?<url>[^'""\s>]+)\k<url>”,而這樣的字符串,通常是不存在的。
這一模式忽略正則表達式中的非轉義空白字符,並啟用“#”後面的注釋,通常用於增強正則表達式的可讀性或是用於教學目的。
舉個例子基本上就會明白了
string test = "(One) and ( Two (Three) Four).";
Regex reg = new Regex(@"\( #普通開括弧
(?> #固化分組
\( (?<OPEN>) #遇到開括弧'OPEN'計數加1
| #分支結構
\) (?<-OPEN>) #遇到閉括弧'OPEN'計數減1
| #分支結構
[^()]+ #非括弧的其它任意字符
)* #以上子串出現0次或任意多次
(?(OPEN)(?!)) #判斷是否還有'OPEN',有則說明不配對,什麼都不匹配
\) #普通閉括弧
", RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n";
}
其中的空白字符被忽略,“#”及該行後面的內容被解釋為注釋。
這一模式將按ECMA的JavaScript語義來解析正則表達式。通常影響的是以下元字符的匹配行為
\w、\W、\d、\D、\s、\S
使得以上元字符只能匹配ASCII碼字符,而不再是匹配相應的Unicode字符。
事實上比如需求中明確要求只匹配英文字母,數字,下劃線,而不包含漢字等字符,那麼完全可以用“[A-Za-z0-9_]”,而不使用“\w”,雖然不夠簡潔,但可讀性更好,語義更明確。
這一模式在.NET中的應用比較少,如不清楚什麼場景下應該使用,可以忽略這一模式。
這一模式指定忽略語言中的區域性差異。一般與IgnoreCase模式一起使用,這一模式的應用場景很少,一般可以忽略,無需了解。
內聯匹配模式在正則表達式內部使用,可以改變局部子表達式的匹配行為,內聯匹配模式支持的模式較少,僅有immsx五種,但使用起來更簡潔,更靈活。在.NET中支持(?imnsx-imnsx:)和(?imnsx-imnsx)兩種形式。
各內聯匹配模式對應的全局匹配模式見匹配模式列表。以下僅就(?i)忽略大小寫模式進行講解,其它模式類同。
語法:(?i:Expression)
這種語法規則表達為括號內的子表達式開啟忽略大小寫模式。
舉例:^[A-Z](?i:[A-Z]{9,19})$
以上正則表示,首字符必須為大寫字母,後面跟9到19個大小寫字母。
string[] test = new string[] { "Abc", "AbcdefGHIjklmn", "abcdefghijklmn" };
Regex reg = new Regex(@"^[A-Z](?i:[A-Z]{9,19})$");
foreach (string s in test)
{
richTextBox2.Text += "源字符串: " + s.PadRight(15, ' ') + " 匹配結果: " + reg.IsMatch(s) + "\n";
}
/*--------輸出--------
源字符串: Abc 匹配結果: False
源字符串: AbcdefGHIjklmn 匹配結果: True
源字符串: abcdefghijklmn 匹配結果: False
*/
語法:(?-i:Expression)
這種語法規則表達為括號內的子表達式關閉忽略大小寫模式。通常與全局匹配模式配合使用,表示全局為忽略大小寫的,局部為嚴格區分大小寫。
舉例:<div id="(?-i:TEST)" [^>]*>[\w\s]+</div>
以上正則表示,div標簽中,僅匹配id為全大寫的“TEST”的標簽內容,其余標簽不匹配。
string test = "<DIV id=\"Test\" class=\"create\">first</div> and <DIV id=\"TEST\" class=\"delete\">second</div>";
Regex reg = new Regex(@"<div id=""(?-i:TEST)""[^>]*>[\w\s]+</div>", RegexOptions.IgnoreCase);
MatchCollection mc = reg.Matches(test);
foreach(Match m in mc)
{
richTextBox2.Text += m.Value + "\n";
}
/*--------輸出--------
<DIV id="TEST" class="delete">second</div>
*/
語法:(?i) 或 (?-i)
(?i)為所在位置右側的子表達式開啟忽略大小寫模式,直到出現(?-i)或者到表達式結束為止;(?-i)為所在位置右側的子表達式關閉忽略大小寫模式,直到出現(?i)或者到表達式結束為止。
通常在正則表達式開始位置使用(?i)來代替RegexOptions.IgnoreCase,使代碼更簡潔。如提取鏈接和文字的正則表達式
MatchCollection mc = Regex.Matches(yourStr, @"(?is)<a(?:(?!href=).)*href=(['""]?)(?<url>[^""'\s>]*)\1[^>]*>(?<text>(?:(?!</a>).)*)</a>");
foreach (Match m in mc)
{
richTextBox2.Text += m.Groups["url"].Value + "\n";
richTextBox2.Text += m.Groups["text"].Value + "\n";
}
.NET中的正則匹配模式基本上已講解完了,最後再來總結一下各匹配模式的應用場景吧。
RegexOption 成員
內聯字符
作用/應用場景
None
N/A
指定不設置任何選項。
一般在動態指定匹配模式時使用。
IgnoreCase
i
指定不區分大小寫的匹配。
只有在正則表達式中,注意是正則表達式中,而不是待匹配的源字符串中,涉及到大小寫形式的元字符或是字符序列時,才使用IgnoreCase模式。
Multiline
m
指定多行模式。更改 ^ 和 $ 的含義,以使它們分別與任何行的開頭和結尾匹配,而不只是與整個字符串的開頭和結尾匹配。
只有在正則表達式中涉及到多行的“^”和“$”的匹配時,才使用Multiline模式。
ExplicitCapture
n
指定唯一有效的捕獲是顯式命名或編號的 (?<name>…) 形式的組。這允許圓括號充當非捕獲組,從而避免了由 (?:…) 導致的語法上的笨拙。
ExplicitCapture模式是為了在不犧牲匹配效率的前提下,提高正則表達式的可讀性,一般在命名捕獲組和普通捕獲組混合出現,而又不關心普通捕獲組的正則表達式中使用。
Compiled
N/A
指定正則表達式將被編譯為程序集。生成該正則表達式的 Microsoft 中間語言 (MSIL) 代碼;以較長的啟動時間為代價,得到更快的執行速度。
以下場景不適合使用:
Singleline
s
指定單行模式。更改句點字符 (.) 的含義,以使它與每個字符(而不是除 \n 之外的所有字符)匹配。
單行模式通常在匹配有換行的文本時使用,采用小數點+單行模式的方式匹配任意字符,在.NET中是效率最高的。
IgnorePatternWhitespace
x
指定從模式中排除非轉義空白並啟用數字符號 (#) 後面的注釋。請注意,空白永遠不會從字符類中消除。
為了提高可讀性,或是為正則表達式加注釋時使用。
RightToLeft
N/A
指定搜索是從右向左而不是從左向右進行的。具有此選項的正則表達式將移動到起始位置的左邊而不是右邊。
除非對源字符串的構成很了解,而且又不得不使用的情況,否則不要輕易使用這一模式。
ECMAScript
N/A
指定已為表達式啟用了符合 ECMAScript 的行為。此選項僅可與 IgnoreCase 和 Multiline 標志一起使用。將 ECMAScript 同任何其他標志一起使用將導致異常。
除非對這一模式應用場景很了解,否則不要使用。
CultureInvariant
N/A
指定忽略語言中的區域性差異。
很少使用,一般無需了解。