首页 > 解决方案 > 最多匹配 n 个字符

问题描述

我正在尝试制作一个最多匹配 7 个组的正则表达式。

((X:){1,6})((:Y){1,6})

X:X:X:X:X::Y:Y             This should match
X:X:X:X:X:X::Y:Y           This should not match.

https://regex101.com/r/zxfAB7/16

有没有办法做到这一点?我需要捕获组 $1 和 $3
我正在使用 C++17 正则表达式。

标签: c++regex

解决方案


如果支持正向预读,您可以使用正向预读来断言不是 8 次重复X::Y

为防止出现空匹配,您可以使用肯定的前瞻来检查是否至少有 1 个匹配。

然后使用 2 个捕获组,在其中重复 0+ 次,或者X:在第一组 a 中匹配:Y,在另一组中匹配 0+ 次。

^(?=(?:X:|:Y))(?!(?:(?:X:|:Y)){8})((?:X:)*)((?::Y)*)$
  • ^字符串的开始
  • (?=正向前瞻,断言右边是
    • (?:X:|:Y)匹配X::Y
  • )关闭正向前瞻
  • (?!负前瞻,断言不是 8 次匹配X:或者:Y
    • (?:(?:X:|:Y)){8}
  • )关闭负前瞻
  • ((?:X:)*)捕获组 1 匹配 0+ 次X:
  • ((?::Y)*)捕获组 2 匹配 0+ 次:Y
  • $字符串结束

正则表达式演示


推荐阅读