()回溯與非回溯
使用(?>…)方式進行非回溯聲明由於正則表達式引擎的貪婪特性導致它在某些情況下將進行回溯以獲得匹配請看下面的示例
Code
string x = Live for nothingdie for something;
Regex r = new Regex(@*thing);
if (rIsMatch(x))
{
ConsoleWriteLine(match: + rMatch(x)Value);//輸出Live for nothing
}
Regex r = new Regex(@(?>*)thing);
if (rIsMatch(x))//不匹配
{
ConsoleWriteLine(match: + rMatch(x)Value);
}
//在r中*由於其貪婪特性將一直匹配到字符串的最後隨後匹配thing但在匹配時失敗此時引擎將回溯並在thing處匹配成功
在r中由於強制非回溯所以整個表達式匹配失敗
()正向預搜索反向預搜索
正向預搜索聲明格式正聲明 (?=…)負聲明 (?!) 聲明本身不作為最終匹配結果的一部分請看下面的示例
Code
string x = used free;
Regex r = new Regex(@\d{}(?= used));
if (rMatches(x)Count==)
{
ConsoleWriteLine(r match: + rMatch(x)Value);//輸出
}
Regex r = new Regex(@\d{}(?! used));
if (rMatches(x)Count==)
{
ConsoleWriteLine(r match: + rMatch(x)Value); //輸出
}
//r中的正聲明表示必須保證在四位數字的後面必須緊跟著 usedr中的負聲明表示四位數字之後不能跟有 used
反向預搜索聲明格式正聲明(?<=)負聲明(?
string x = used: free:;
Regex r = new Regex(@(?<=used:)\d{});
if (rMatches(x)Count==)
{
ConsoleWriteLine(r match: + rMatch(x)Value);//輸出
}
Regex r = new Regex(@(?
if (rMatches(x)Count==)
{
ConsoleWriteLine(r match: + rMatch(x)Value);//輸出
}
//r中的反向正聲明表示在位數字之前必須緊跟著used:r中的反向負聲明表示在位數字之前必須緊跟著除used:之外的字符串
()十六進制字符范圍
正則表達式中可以使用 \xXX 和 \uXXXX 表示一個字符(X 表示一個十六進制數)形式字符范圍
\xXX 編號在 到 范圍的字符比如空格可以使用 \x 表示
\uXXXX 任何字符可以使用 \u 再加上其編號的位十六進制數表示比如漢字可以使用[\ue\ufa]表示
()對[]的比較完備的匹配
下面是一個比較綜合的示例對於匹配[]需要特殊考慮的地方包括
*合法合法合法合法
*空字符串不合法僅小數點不合法大於不合法
*數值是可帶後綴的如f表示該值為一個float類型(未考慮)
Code
Regex r = new Regex(@^\+?*(?:(\*)?|(\d{}(?=\\d)|\d{}(?=($|\$)))(\\d*)?)$);
string x = ;
while (true)
{
x = ConsoleReadLine();
if (x != exit)
{
if (rIsMatch(x))
{
ConsoleWriteLine(x + succeed!);
}
else
{
ConsoleWriteLine(x + failed!);
}
}
else
{
break;
}
}
()精確匹配有時候是困難的
有些需求要做到精確匹配比較困難例如日期UrlEmail地址等其中一些你甚至需要研究一些專門的文檔寫出精確完備的表達式對於這種情況只能退而求其次保證比較精確的匹配例如對於日期可以基於應用系統的實際情況考慮一段較短的時間或者對於像Email的匹配可以只考慮最常見的形式
From:http://tw.wingwit.com/Article/program/net/201311/15445.html