我想测试正则表达式是否匹配特定索引处的字符串的一部分(并且仅从该特定索引开始)。例如,给定字符串“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));
显然,我可以检查结果匹配是否从我感兴趣的索引开始,但是我会在大字符串上做很多次,所以我不想浪费时间在以后搜索匹配在字符串中。另外,我不会事先知道我将实际测试字符串的正则表达式。
我不想:
我想使用任意用户提供的语法解析潜在的大型用户提供的文本体。语法将以BNF或类似PEG的语法定义,终端将是字符串文字或正则表达式。因此,我需要检查字符串的下一部分是否与语法驱动的任何潜在终端匹配。
答案 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()继续扫描匹配。