为什么这个正则表达式操作不起作用?

时间:2015-02-03 14:48:46

标签: c# regex

        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中只有一个命名组?我得到前面提到的两行输出。

2 个答案:

答案 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)

^(?<someone>\S+).*$

试试这个。a donut was eaten by ${someone}.。见。演示。

https://regex101.com/r/vD5iH9/62