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

时间:2009-08-11 20:02:26

标签: c# regex

我想测试正则表达式是否匹配特定索引处的字符串的一部分(并且仅从该特定索引开始)。例如,给定字符串“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. 搜索其余部分 匹配的字符串或做任何事情 其他不符合要求的人 针对a的大量测试 大字符串。
  4. 我想使用任意用户提供的语法解析潜在的大型用户提供的文本体。语法将以BNF或类似PEG的语法定义,终端将是字符串文字或正则表达式。因此,我需要检查字符串的下一部分是否与语法驱动的任何潜在终端匹配。

4 个答案:

答案 0 :(得分:12)

如何使用以Regex.IsMatch(string, int)开头的正则表达式\G(意为“最后一场比赛的开始”)?

这似乎有效:

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
    }
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

^.{8}[\d]

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

答案 3 :(得分:0)

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

如果您只检查数字,这可能比检查任意表达式更容易。正则表达式的本质是扫描到最后才能找到匹配项。如果您想要阻止扫描,则需要包含长度,或者使用除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()继续扫描匹配。