对于 string "1-2-3-4"
,我想创建一个正则表达式,它会给我以下匹配项,即每个匹配的数字对由 1 个或多个破折号分隔:
"1-2"
"2-3"
"3-4"
每个数字都在自己的捕获组中。
第一次尝试(c# 风格):
(?<first>\d)-+(?<second>\d)
这给了我:
"1-2"
"3-4"
显然,在获得第一个匹配项时,我已经消耗了数字"2"
,因此要匹配的下一个字符是 dash after "2"
。
然后我最终阅读了我的 c#-/Regex-skills 并偶然发现了平衡组,进入我的固执。据我了解,这应该这样做(但事实并非如此):
(?<entire>(?:(?<first-entire>\k<entire>)|(?<first>\d))-+(?<second>\d))
这产生与我第一次尝试相同的结果。我希望这<first-entire>
件事会将捕获倒回到上一个匹配项(如果有的话),使该\k<entire>
部分现在匹配整个上一个匹配项(在 1 次迭代之后将是"1-2"
),或者 - 如果第一次迭代 - 回退到<first>\d
模式。
我误解了什么?
更新:可能应该准确解释我的目标 - 但评论者暗示,找到了我的目标的解决方案,即删除可能出现在数字之间的所有破折号(1个或更多)。解决了一个更简单的积极前瞻,如:
Regex _stripTheDashes = new Regex(@"(?<digit>\d)-+(?=\d)", RegexOptions.Compiled);
var stripped = _stripTheDashes.Replace(s, m => m.Groups["digit"].Value);
将保持原样,因为它已作为副本关闭。显然我对使用平衡组是错误的:)