3

我想找出正则表达式是否在字符串的特定位置匹配。

例子:

Regex r = new Regex("d");
string s = "abcdefg";

我希望 match 函数在它位于确切给定位置时才找到匹配项,以便使用上面的示例,匹配位置1,35应该分别给出no match,matchno match。不幸的是,C#Regex.Match方法给出了:

r.Match(s, 1); // => match ("d")
r.Match(s, 3); // => match ("d")
r.Match(s, 5); // => no match

我知道这是因为该Regex.Match方法向前搜索第一个匹配项,但是如何防止这种行为而不必制作子字符串?

4

3 回答 3

5

添加\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,您实际上是在告诉它之前有一场比赛,该比赛在该位置结束。

于 2012-11-29T14:01:04.627 回答
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)

或者,为了避免在内存中复制字符串,请使用 quantified .

Regex r = new Regex("^.{3}d");
r.IsMatch("abcdefg");

模式^.{3}d

  • 从字符串的开头开始
  • 完全匹配任何内容的三个字符
  • 然后匹配字母'd'
于 2012-11-29T13:08:41.393 回答
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

于 2012-11-29T13:13:47.830 回答