c#正则表达式匹配字符串中的特定索引?

我想测试一个正则表达式是否匹配特定索引处的字符串的一部分(并且仅从该特定索引开始)。 例如,给定字符串“one two 3 4 five”,我想知道,在索引8处,正则表达式[0-9] +将匹配“3”。 RegularExpression.IsMatch和Match都采用起始索引,但是如果需要,它们都将搜索字符串的其余部分以进行匹配。

string text="one two 3 4 five"; Regex num=new Regex("[0-9]+"); //unfortunately num.IsMatch(text,0) also finds a match and returns true Console.WriteLine("{0} {1}",num.IsMatch(text, 8),num.IsMatch(text,0)); 

显然,我可以检查结果匹配是否从我感兴趣的索引开始,但是我将在大字符串上执行此操作很多次,所以我不想浪费时间在字符串中搜索匹配项。 另外,我不会事先知道我将实际测试字符串的正则表达式。

我不想:

  1. 将字符串分割成某些边界,就像空格一样,因为在我的情况下,我事先并不知道合适的边界是什么
  2. 必须以任何方式修改输入字符串(比如在索引8处获取子字符串然后在正则表达式中使用^)
  3. 搜索字符串的其余部分以进行匹配,或者针对大字符串执行大量测试所不具备的其他任何内容。

我想使用任意用户提供的语法解析潜在的大型用户提供的文本正文。 语法将以BNF或类似PEG的语法定义,终端将是字符串文字或正则表达式。 因此,我需要检查字符串的下一部分是否与语法驱动的任何潜在终端匹配。

如何使用以\G开头的正则表达式使用Regex.IsMatch(string, int) (意思是“最后一次匹配的开始”)?

这似乎有效:

 using System; using System.Text.RegularExpressions; class Test { static void Main() { string text="one two 3 4 five"; Regex num=new Regex(@"\G[0-9]+"); Console.WriteLine("{0} {1}", num.IsMatch(text, 8), // True num.IsMatch(text, 0)); // False } } 

如果您只想搜索文本的子字符串,请在正则表达式之前获取该子字符串。

 myRegex.Match(myString.Substring(8, 10)); 

我不确定我是否完全理解这个问题,但在我看来,你可以简单地将位置作为正则表达式的一部分,例如

 ^.{8}[\d] 

如果字符串的开头和数字之间有8个字符,则匹配。

如果您知道字符串中潜在匹配的最大长度,则检查是否会限制字符串的扫描。

如果您只检查数字,这可能比检查任意表达式更容易。 正则表达式的本质是扫描到最后才能找到匹配项。 如果要防止扫描,则需要包含长度,或使用除Regex之外的其他内容。

 string text = "one two 3 4 five"; Regex num = new Regex("[0-9]+"); int indexToCheck = 8; int maxMatchLength = ...; Match m = num.Match(text, indexToCheck, maxMatchLength); 

你知道什么类型的表达式可能会对字符串运行,并扫描整个字符串是否过多的开销?

num.Match将返回第一个匹配(如果存在),然后停止扫描。 如果你想要更多匹配,你可以调用m.NextMatch()来继续扫描匹配。