c# - 如何匹配从给定索引开始的正则表达式?

标签 c# regex .net-core

使用 .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 位数的字符),但是,我宁愿避免以一种或另一种方式在所有三种情况下可能发生的开销:

<表类="s-表"> <头> <日># 变通办法 缺点 <正文> 1 我可以检查结果匹配以查看其是否为 Index属性与提供的索引匹配。 整个字符串的匹配仍然会发生,至少直到找到第一个匹配项(或到达字符串末尾)。 2 我可以在开始 anchor 前添加 ^到我的正则表达式并始终只测试从指定索引开始的子字符串。 由于字符串可能很长而且我可能会在多个起始位置测试相同的正则表达式(但同样,只有完全在这些位置上),我担心频繁的部分测试会带来性能缺陷复制长字符串。 (范围可能是一种出路,但不幸的是,Regex 类不能(还?)用于扫描它们。) 3 我可以在前面加上 "^.{#}" (用 # 替换为要测试的字符索引)每个表达式并从头开始匹配,然后用捕获组找出真正有趣的匹配。 我需要在整个输入字符串的多个可能起始位置上测试相同的正则表达式。每次跳过的字符数都会发生变化,这意味着每次都要编译一个新的正则表达式,而不是重新使用我已有的正则表达式,这又让人感觉有些不干净。

最后,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/

相关文章:

c# - 存储过程返回 null 作为输出参数

c# - C#中用于文件名验证的正则表达式

c# - 没有指定名称字段的编码,任何非 ASCII 字节都将被丢弃

c# - MetadataAddress 或 Authority 必须使用 HTTPS,除非通过设置 RequireHttpsMetadata=false 禁用开发

c# - VB.NET 中的“Null-Safe”点符号……或者它是否存在于任何语言中? 'safe dereferencing operator' 或等效使用 LINQ?

c# - 根据另一个元素值选择 XML 元素

java - 为什么找到的 token (antlr)中出现空白?

api - .net core - 如何在 AuthorizationHandler 上返回 403?

C# 在创建后更改字符串

sql - RegEx:字符串中重复相同的元音 - Oracle SQL