0

对于 string "1-2-3-4",我想创建一个正则表达式,它会给我以下匹配项,即每个匹配的数字对由 1 个或多个破折号分隔:

  1. "1-2"
  2. "2-3"
  3. "3-4"

每个数字都在自己的捕获组中。

第一次尝试(c# 风格):

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

这给了我:

  1. "1-2"
  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);

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

4

0 回答 0