繁体   English   中英

为什么此Regex操作不起作用?

[英]Why doesn't this Regex operation work?

        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));
            }
        }

上下文是输出应显示“他们吃了一个甜甜圈”,但我却得到了“ Theya甜甜圈被他们吃了”。

而且我不确定为什么,因为我一直在寻找替代品的工作方式,而且看起来会这样。

最后,虽然没什么大不了的,但由于Regex r中只有一个命名组,难道不应该只进行一次循环迭代吗? 我得到前面提到的输出的两行。

您的主要问题是(?<someone>)无法捕获任何内容。 这是一个命名的组,但是一个组需要包含要匹配的内容,否则它将只匹配空字符串。 因此,您要用" ate a donut"替换" ate a donut" "a donut was eaten by " ,并保留了"They"前缀。

(?<someone>) (?<someone>\\w+)替换(?<someone>) ,您应该捕获一个单词(AZ,az,0-9或下划线中的一个或多个)。 需要注意的是,写一个\\在C#字符串文字,你要么需要写\\\\或者你需要与你的开始字符串@"而不仅仅是"

另外,循环有两次迭代,因为整个匹配都计为“ 0”组-因此您拥有“ 0”组和“某人”组。

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

尝试一下。 a donut was eaten by ${someone}.a donut was eaten by ${someone}. 请参阅演示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM