如何在C#中的字符串的特定位置找到正则表达式匹配?

时间:2012-11-29 13:03:02

标签: c# .net regex

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

示例:

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

我希望匹配功能找到匹配 ,如果它位于确切的给定位置,以便使用上面的示例,匹配位置135应分别提供no matchmatchno match。不幸的是,C#Regex.Match方法给出了:

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

我理解这是因为Regex.Match方法会向前搜索第一个匹配项,但如何在不必创建子字符串的情况下阻止此行为?

3 个答案:

答案 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

  • 从字符串的开头
  • 开始
  • 正好匹配任何内容的三个字符
  • 然后匹配字母'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