为什么尝试在Regex中使用平衡组失败?

时间:2017-04-18 13:08:34

标签: c# .net regex regex-lookarounds balancing-groups

对于字符串"1-2-3-4",我想创建一个正则表达式,它会给我以下匹配,即每个匹配的数字对以1或更多短划线分隔:

  1. "1-2"
  2. "2-3"
  3. "3-4"
  4. 每个数字都在自己的捕获组中。

    首次尝试(c#风味):

    (?<first>\d)-+(?<second>\d)
    

    这给了我:

    1. "1-2"
    2. "3-4"
    3. 显然,在获得第一场比赛时,我已经消耗了数字"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);
      

      将原样保留,因为它已作为副本关闭。显然我使用平衡组是错误的:)

0 个答案:

没有答案