c++ - 最多匹配 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 正则表达式。
解决方案
如果支持正向预读,您可以使用正向预读来断言不是 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
$
字符串结束
推荐阅读
- karate - 空手道用户界面和加特林
- reactjs - 如何使用 React markdown-to-jsx 导入降价文件
- python - Jupyter Notebook 打不开 Erno122
- ios - 操作 CVPixelbuffer、vImage、CGImage 和 UIImage 进行旋转
- c - 处理 sqrt (2) 的连续分数表示的分子的序列的递归函数
- c# - 使连接实体框架动态
- c# - 将动态对象从请求反序列化为强类型
- html - 如何在保留默认样式行为的同时覆盖 HTML5 输入验证的默认浏览器样式?
- amazon-web-services - 您能否将 IAM 实例配置文件限制为特定的 Linux 账户?
- optimization - Gekko - 优化调度的不可行解决方案,与 gurobi 进行比较