c# - 匹配 FOO 连字符和数字的复杂正则表达式
问题描述
我们正在尝试创建一个正则表达式,它必须匹配以下字符串:
- FOO-123123123123
- FOO123123123123
- FOO-123-123-123-123
它必须满足以下条件:
- 字符串必须以 FOO 开头
- foo 之后的符号可能只有连字符(可选)和数字
- 连续不能有多个连字符
- 字符串的整个长度不能超过 50 个符号且少于 6 个
我们已经想出了这样的东西
^FOO(-{0,1}[\d]+){6,50}$
但似乎 {6,50} 将限制设置为 50 不是针对字符串的总长度,而是针对此捕获组的重复
(-{0,1}[\d]+)
你能请教吗?
解决方案
您可以使用
^(?=.{6,50}$)FOO-?\d+(?:-\d+)*$
请参阅正则表达式演示。
细节
^
- 字符串的开始(?=.{6,50}$)
- 字符串长度应为 6 到 50 个字符FOO
- 一个FOO
子串-?
- 一个可选的-
\d+
- 1+ 位数(?:-\d+)*
- 0 次或多次重复,-
然后 1+ 位$
- 字符串结束。
注意:\d
可能匹配多于 ASCII 数字,如果您担心它使用RegexOptions.ECMAScript
选项编译正则表达式,或替换\d
为[0-9]
.
此外,^(?=.{6,50}$)FOO(?:-?\d+)*$
它也可以工作并且更短,但是在量化组内使用单个强制性模式和其他可选模式是不好的。在这个确切的情况下,它是可以的,但在其他情况下,遵循这个逻辑可能会导致灾难性的回溯。
推荐阅读
- javascript - 在 Google Cloud 上运行 Node JS 脚本的最佳方式
- performance-testing - Cumulative Layout Shift 是否停止测量用户交互?
- javascript - 检测到以 www. 开头的链接问题,用一个元素替换
- reactjs - 状态获取不保存刷新反应本机博览会
- c - 关于clang 7错误问题的c问题?
- php - divi主题生成器中的woocommerce迷你购物车
- arrays - 使用数组将 XML 转换为 JSON
- python - 为什么 python 不接受我从文本文件中获取的颜色?Python Tkinter
- javascript - node.js中连接redis失败
- c++ - 错误:CreateProcess 错误=216 - Clion 2020.1.2