[英]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}.
请参阅演示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.