使用 .NET Regex
class , 如果匹配恰好从特定字符索引处开始,是否有任何方法仅匹配字符串中的正则表达式?
让我们看一个例子:
- 正则表达式
ab
- 输入字符串:
ababab
现在,我可以在输入字符串中搜索正则表达式(在下文中命名为 expr
)的匹配项,例如,从字符索引 2
开始:
var match = expr.Match("ababab", 2);
// match ------------->XXab
这将成功并返回索引 2
处的匹配项.
如果我通过索引 1
,这将也成功,指向与上面相同的事件:
var match = expr.Match("ababab", 1);
// match ------------->X ab
是否有任何有效的方法可以让第二个测试失败,因为匹配没有恰好在指定的索引处开始?
显然,有一些解决方法。 由于我的测试发生的字符串可能是......“长”(想想可能是 4 位数的字符),但是,我宁愿避免以一种或另一种方式在所有三种情况下可能发生的开销:
Index
属性与提供的索引匹配。^
到我的正则表达式并始终只测试从指定索引开始的子字符串。Regex
类不能(还?)用于扫描它们。)"^.{#}"
(用 #
替换为要测试的字符索引)每个表达式并从头开始匹配,然后用捕获组找出真正有趣的匹配。最后,Match
除了开始索引之外接受最大长度检查的重载似乎没有用,因为在我的情况下,正则表达式不是固定的并且很可能包含可变长度部分,所以我不知道 a 的预期长度提前匹配。
最佳答案
看来您可以使用 \G
运算符,\Gab
模式将允许您在第二个索引处进行匹配,但会在第一个索引处失败,请参见 this C# demo :
Regex expr = new Regex(@"\Gab");
Console.WriteLine(expr.Match("ababab", 1)?.Success); // => False
Regex expr2 = new Regex(@"\Gab");
Console.WriteLine(expr2.Match("ababab", 2)?.Success); // => True
根据文档,\G
operator 匹配如下:
The match must occur at the point where the previous match ended, or if there was no previous match, at the position in the string where matching started."
关于c# - 如何匹配从给定索引开始的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75026057/