获取满足正则表达式匹配的确切子字符串

本文关键字:字符串 满足 正则表达式 获取 | 更新日期: 2023-09-27 18:33:44

我想在下面获取正则表达式匹配的索引:

input : ab 
regex: a(?=b)

Match 对象包含有关字符串 (a( 的实际匹配部分的信息,不包括匹配成功所需的零宽度断言。我希望能够捕获满足此匹配的确切子字符串。我不想手动扩展字符串来执行此操作。在我看来,FCL 的某个地方应该有一种方法。

编辑

只是为了让事情更清楚,因为有关于不使用前瞻的建议。我很清楚,当我想实际匹配字符串的一部分时,我不应该使用前瞻。但是,我正在处理的应用程序会收到一系列用于预处理阶段的正则表达式。这些正则表达式是我无法控制的。我不能保证它们与零宽度断言正确匹配。在此阶段,匹配的正则表达式将替换为一段文本。为了使以下正则表达式替换过程正常工作,我需要能够捕获满足正则表达式的字符串中的子字符串。请考虑以下代码:

string input = "abcdefg";
Regex regex = new Regex("a(?=b)");
Match m = regex.Match(input);
regex.Replace(m.Value, "z").Dump();

首先请注意,我希望替换仅在发生匹配的输入部分而不是整个输入中进行。这非常重要,因为我不希望所有的比赛都被替换。上面的代码输出是"a"而不是"z"。原因是m.Valuea的,正则表达式不会用z替换单个a。它将用"z"替换在"ab"中找到的a。我希望能够将"ab"传递给Replace函数。

希望这能解决问题。

获取满足正则表达式匹配的确切子字符串

您使用

了错误的 API 来控制替换: 与其将匹配项传递回正则表达式,不如使用 Replace 的四参数重载,这使您可以更严格地控制原始字符串中要替换的内容,以及要考虑替换字符串的哪些部分:

string input = "abcdefg";
Regex regex = new Regex("a(?=b)");
regex.Replace(input , "z", 1, 0).Dump();

只有第一个匹配项将被替换,从索引零开始。如果要继续替换其他匹配项,请将最后一个参数更改为新的起始索引。将第三个参数保持在1,以便最多进行一次替换。