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

时间:2014-12-08 16:04:58

标签: c# .net regex lookahead

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

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且正则表达式不会用a替换单个z。它将用'z'替换'ab'中找到的a。我希望能够将'ab'传递给Replace函数。

希望这可以解决问题。

1 个答案:

答案 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,以便最多进行一次替换。