()擇一匹配C#正則表達式中的 (|)符號似乎沒有一個專門的稱謂姑且稱之為擇一匹配吧事實上像[az]也是一種擇一匹配只不過它只能匹配單個字符而(|)則提供了更大的范圍(ab|xy)表示匹配ab或匹配xy注意|與()在此是一個整體下面提供一些簡單的示例
string x = ;
string y = ;
string z = ;
string a = ;
string b = ;
string c = ;
string d = ;
string e = ;
Regex r = new Regex(@^\+?(((+)*)|([]?[])(\\d+)*)$);
ConsoleWriteLine(x match count: + rMatches(x)Count);//
ConsoleWriteLine(y match count: + rMatches(y)Count);//
ConsoleWriteLine(z match count: + rMatches(z)Count);//
ConsoleWriteLine(a match count: + rMatches(a)Count);//
ConsoleWriteLine(b match count: + rMatches(b)Count);//
ConsoleWriteLine(c match count: + rMatches(c)Count);//
ConsoleWriteLine(d match count: + rMatches(d)Count);//
ConsoleWriteLine(e match count: + rMatches(e)Count);//
//匹配到的數最外層的括號內包含兩部分((+)*)([]?[])(\\d+)*這兩部分是OR的關系即正則表達式引擎會先嘗試匹配如果失敗則嘗試匹配後一個表達式(表示[)范圍中的數字)
()特殊字符的匹配下面提供一些簡單的示例
string x = \\;
Regex r = new Regex(^\\\\$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
Regex r = new Regex(@^\\$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
Regex r = new Regex(^\\$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
//匹配\
string x = \;
Regex r = new Regex(^\$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
Regex r = new Regex(@^$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
//匹配雙引號
()組與非捕獲組以下提供一些簡單的示例
string x = Live for nothingdie for something;
string y = Live for nothingdie for somebody;
Regex r = new Regex(@^Live ([az]{}) no([az]{})die \ some\$);
ConsoleWriteLine(x match count: + rMatches(x)Count);//
ConsoleWriteLine(y match count: + rMatches(y)Count);//
//正則表達式引擎會記憶()中匹配到的內容作為一個組並且可以通過索引的方式進行引用表達式中的\用於反向引用表達式中出現的第一個組即粗體標識的第一個括號內容\則依此類推
string x = Live for nothingdie for something;
Regex r = new Regex(@^Live for no([az]{})die for some\$);
if (rIsMatch(x))
{
ConsoleWriteLine(group value: + rMatch(x)Groups[]Value);//輸出thing
}
//獲取組中的內容注意此處是Groups[]因為Groups[]是整個匹配的字符串即整個變量x的內容
string x = Live for nothingdie for something;
Regex r = new Regex(@^Live for no(?[az]{})die for some\$);
if (rIsMatch(x))
{
ConsoleWriteLine(group value: + rMatch(x)Groups[g]Value);//輸出thing
}
//可根據組名進行索引使用以下格式為標識一個組的名稱(?…)
string x = Live for nothing nothing;
Regex r = new Regex(@([az]+) \);
if (rIsMatch(x))
{
x = rReplace(x $);
ConsoleWriteLine(var x: + x);//輸出Live for nothing
}
//刪除原字符串中重復出現的nothing在表達式之外使用$來引用第一個組下面則是通過組名來引用
string x = Live for nothing nothing;
Regex r = new Regex(@(?[az]+) \);
if (rIsMatch(x))
{
x = rReplace(x ${g});
ConsoleWriteLine(var x: + x);//輸出Live for nothing
}
string x = Live for nothing;
Regex r = new Regex(@^Live for no(?:[az]{})$);
if (rIsMatch(x))
{
ConsoleWriteLine(group value: + rMatch(x)Groups[]Value);//輸出(空)
}
//在組前加上?:表示這是個非捕獲組即引擎將不保存該組的內容
()貪婪與非貪婪
正則表達式的引擎是貪婪只要模式允許它將匹配盡可能多的字符通過在重復描述字符(*+)後面添加?可以將匹配模式改成非貪婪請看以下示例
Code
string x = Live for nothingdie for something;
Regex r = new Regex(@*thing);
if (rIsMatch(x))
{
ConsoleWriteLine(match: + rMatch(x)Value);//輸出Live for nothingdie for something
}
Regex r = new Regex(@*?thing);
if (rIsMatch(x))
{
ConsoleWriteLine(match: + rMatch(x)Value);//輸出Live for nothing
}
From:http://tw.wingwit.com/Article/program/net/201311/15503.html