我想获得下面正则表达式匹配的索引:
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.Value
为a
且正则表达式不会用a
替换单个z
。它将用'z'替换'ab'中找到的a。我希望能够将'ab'传递给Replace
函数。
希望这可以解决问题。
答案 0 :(得分:1)
您使用错误的API来控制替换:不是将匹配传递回正则表达式,而是使用the four-argument overload of Replace
来更严格地控制原始字符串中的替换内容以及字符串的哪些部分考虑更换:
string input = "abcdefg";
Regex regex = new Regex("a(?=b)");
regex.Replace(input , "z", 1, 0).Dump();
从索引零开始,只会替换第一个匹配项。如果要继续替换其他匹配项,请将最后一个参数更改为新的起始索引。将第三个参数保留在1
,以便最多进行一次替换。