对于字符串"1-2-3-4"
,我想创建一个正则表达式,它会给我以下匹配,即每个匹配的数字对以1或更多短划线分隔:
"1-2"
"2-3"
"3-4"
每个数字都在自己的捕获组中。
首次尝试(c#风味):
(?<first>\d)-+(?<second>\d)
这给了我:
"1-2"
"3-4"
显然,在获得第一场比赛时,我已经消耗了数字"2"
,因此匹配的下一个字符是"2"
之后的短划线。
然后我最后读了我的c# - / Regex-skills并偶然发现了Balancing Groups,进入了我的固执。据我所知,这应该做到(但事实并非如此):
(?<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);
将原样保留,因为它已作为副本关闭。显然我使用平衡组是错误的:)