我想测试正则表达式是否会匹配特定索引处的字符串的一部分(并且仅从该特定索引开始)。例如,给定字符串“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));
显然,我可以检查生成的匹配项是否从我感兴趣的索引开始,但我会在大字符串上多次执行此操作,所以我不想稍后再浪费时间搜索匹配项在字符串中。此外,我不会提前知道我将针对字符串实际测试哪些正则表达式。
我不想:
- 在某个边界上拆分字符串 喜欢空白,因为在我的 我不会提前知道的情况 什么是合适的边界
- 必须修改输入字符串 任何方式(比如获取子串 在索引 8 处,然后在 正则表达式)
- 搜索其余的 匹配字符串或做任何事情 否则那不会是高性能的 针对a的大量测试 大字符串。
我想使用任意用户提供的语法来解析可能很大的用户提供的文本正文。语法将以 BNF 或类似 PEG 的语法定义,终端将是字符串文字或正则表达式。因此,我需要检查字符串的下一部分是否与语法驱动的任何潜在终端相匹配。
最佳答案
如何使用 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
}
}
关于C#正则表达式匹配字符串中的特定索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262583/