[英]How can I find a Regex match at a specific location of the string in C#?
我想知道正則表達式是否匹配字符串的特定位置。
例:
Regex r = new Regex("d");
string s = "abcdefg";
我想匹配函數找到匹配, 只有當它使得使用上面的例子,在位置匹配是在精確的給定的位置1
, 3
,及5
應該給no match
, match
和no match
,分別。 不幸的是,C# Regex.Match
方法給出了:
r.Match(s, 1); // => match ("d")
r.Match(s, 3); // => match ("d")
r.Match(s, 5); // => no match
我理解這是因為Regex.Match
方法向前搜索第一個匹配,但是如何在不必創建子字符串的情況下阻止此行為?
將\\G
添加到正則表達式的開頭:
Regex r = new Regex(@"\Gd");
string s = "abcdefg";
Console.WriteLine(r.Match(s, 1).Success); // False
Console.WriteLine(r.Match(s, 3).Success); // True
Console.WriteLine(r.Match(s, 5).Success); // False
\\G
將匹配錨定到上一個匹配結束的位置,如果沒有先前的匹配,則將其錨定到字符串的開頭。 隨着第二個參數Match
,你有效地告訴它有以前的比賽,這在該位置結束。
使用substring
和字符串開頭的錨點^
:
Regex r = new Regex("^d"); // Use the start of string anchor
string s = "abcdefg";
r.IsMatch(s.Substring(3)); // Match at exactly fourth character (0-based index 3)
或者,為避免將字符串復制到內存中,請使用量化.
:
Regex r = new Regex("^.{3}d");
r.IsMatch("abcdefg");
模式^.{3}d
說
好吧,如果你總是尋找相同的索引,你可以通過在開頭添加通配符來填充你的正則表達式,以“填充”結果,即:
Regex r = new Regex("^.{3}d");
r.isMatch("abcdefg"); // true
r.isMatch("adcffed"); // false
r.isMatch("abcddef"); // true
另一方面,如果你想使用不同索引的相同正則表達式,你可以只使用^
字符匹配字符串的開頭:
Regex r = new Regex("^d");
r.isMatch("abcdefg".substring(3)); // true
r.isMatch("adcffed".substring(3)); // false
r.isMatch("abcddef".substring(1)); // false
注意:如果你只是在尋找一個簡單的字符串而不是一個模式,你應該只使用string.IndexOf
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.