我想知道正则表达式是否匹配字符串的特定位置。
示例:
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
方法会向前搜索第一个匹配项,但如何在不必创建子字符串的情况下阻止此行为?
答案 0 :(得分:4)
将\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
的第二个参数,您有效地告诉它 之前的匹配,该匹配在该位置结束。
答案 1 :(得分:2)
使用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
说
答案 2 :(得分:1)
好吧,如果你一直在寻找相同的索引,你可以通过在开头添加通配符来填充你的正则表达式,以“填充”结果,即:
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