C#正則表示式入門(中)
一、忽略匹配優先模式
- *? 重複任意次,但儘可能少重複
- +? 重複1次或更多次,但儘可能少重複
- ?? 重複0次或1次,但儘可能少重複
- {n,m}? 重複n到m次,但儘可能少重複
- {n,}? 重複n次以上,但儘可能少重複
【例二】在滿足匹配時,匹配儘可能長的字串,預設情況下,採用匹配優先。
string pattern1 = @"a.*c"; // greedy match
Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abcabc"
【例三】使用忽略匹配優先
string pattern1 = @"a.*?c"; // non-greedy match
Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abc"
【例三】使用忽略匹配優先及環視
string source = "https<B>billes kites is</B> kl <B>uoioasd <B> asdf</B>uo</B>cs";
Regex reg = new Regex("<B>.*</B>",RegexOptions.IgnoreCase);
string res = reg.Match(source).Value;
Console.WriteLine(res);//列印<B>billes kites is</B> kl <B>uoioasd <B> asdf</B>uo</B>
///////////下面使用環視就可以不使用忽略匹配優先了//////////
source = "<B>uoioasd <B> asdf</B>uo</B>cs";
reg = new Regex("<B>((?!</B>).)*</B>", RegexOptions.IgnoreCase);//環視,不出現</B>
res = reg.Match(source).Value;
Console.WriteLine(res);//列印<B>uoioasd <B> asdf</B>
reg = new Regex("<B>((?!</B>).)*</B>", RegexOptions.IgnoreCase);//環視,不出現</B>及<B>
res = reg.Match(source).Value;
Console.WriteLine(res);//列印<B> asdf</B>
二、Matches函式
在輸入字串中搜索正則表示式的所有匹配項並返回所有匹配。
過載列表:
【例一】
mc = Regex.Matches(affiliationString, "<span style=\"margin:0 5px 0 0\">.*?</td>",
RegexOptions.Singleline); // affiliationString為查詢的字串
string affiliation = "";
foreach (Match item in mc)
{
if (item.Value.Length > 1)
{
affiliation += item.Value + ";";
}
}
三、IsMatch函式
指示 Regex 建構函式中指定的正則表示式在指定的輸入字串中是否找到了匹配項。
【例一】
Regex reg = new Regex("^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$");//網址格式
if (!reg.IsMatch(this.txtUrl.Text.Trim(), 0))
{
MessageBox.Show("請輸入正確網址!");
return;
}
四、分組
分組注意事項:分組0是整個正則表示式匹配到的結果,然後依次是未命名分組。
例如:
(\w)(?<Num>\d+)(\s+)
1 3 2
特殊的Replacement處理
Regex.Replace方法和Match.Result方法都可以接收能夠進行特殊處理的replacement字串。下面的字元序列會被匹配到的文字所替換:
字元序列 替換內容
$& 整個表示式匹配的文字,相當於$0
$1 $2 對應編號的捕獲分組所匹配的文字
${name} 對應命名捕獲分組匹配的文字
$‘ 目標字串中匹配文字之前的文字
$' 目標字串中匹配文字之後的文字
$$ 單個$字元($1的顯示為$$!)
$_ 正則原始目標字串的副本
$+ .NET中表示最後的那個捕獲型括號匹配的文字
【示例】
string source = "au.https://123.26.80.11/cs.com/index.aspx";
Regex reg = new Regex(@"https[\D]+(?<number>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/(?<domain>[^\.]+)[^/]+/([^\s$]+)", RegexOptions.IgnoreCase);
Match tmp = reg.Match(source);
if (tmp.Success)//匹配成功
{
string res = reg.Match(source).Groups["number"].Value;
Console.WriteLine(res);//列印123.26.80.11
res = reg.Match(source).Groups["domain"].Value;
Console.WriteLine(res);//列印cs
res = reg.Match(source).Groups[1].Value;
Console.WriteLine(res);//列印index.aspx
}