string input = "They ate a donut", output = "a donut was eaten by ${someone}.";
Regex r = new Regex("(?<someone>) ate a donut");
if (r.IsMatch(input))
{
foreach (string s in r.GetGroupNames())
{
Debug.WriteLine(r.Replace(input, output));
}
}
背景是输出应显示“甜甜圈被他们吃掉”,但我得到“他们吃了甜甜圈”。
而且我不确定为什么,因为我一直在查找替换是如何工作的,这似乎就是这样。
最后,虽然不是很重要,但是不应该只有一次循环迭代,因为Regex r中只有一个命名组?我得到前面提到的两行输出。
答案 0 :(得分:1)
您的主要问题是(?<someone>)
没有捕获任何内容。它是一个命名组,但是一个组需要包含要匹配的内容,或者它只是匹配空字符串。因此,您要将" ate a donut"
替换为"a donut was eaten by "
,并保留"They"
前缀。
将(?<someone>)
替换为例如(?<someone>\w+)
你应该捕获一个单词(A-Z,a-z,0-9或下划线中的一个或多个)。请注意,要在C#字符串文字中编写\
,您需要编写\\
或者需要使用@"
而不是"
来开始字符串。< / p>
此外,循环有两次迭代,因为整个匹配计为组&#34; 0&#34; - 所以你有小组&#34; 0&#34;和小组&#34;某人&#34;。
答案 1 :(得分:0)