我们正在尝试创建一个正则表达式,它必须匹配以下字符串:
- 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+)*$
参见 regex demo .
详情
^- 字符串的开始(?=.{6,50}$)- 字符串长度应为 6 到 50 个字符FOO-FOO子串-?- 一个可选的-\d+- 1+ 位(?:-\d+)*--0 次或多次重复,然后是 1+ 位数字$- 字符串结尾。
注:\d可能match more than ASCII digits ,如果您担心它使用 RegexOptions.ECMAScript 选项编译正则表达式,或将 \d 替换为 [0-9]。
此外,^(?=.{6,50}$)FOO(?:-?\d+)*$ 也可以工作并且更短,但是使用单个强制模式与量化组内的其他可选模式。在这种情况下,没问题,但在其他情况下,遵循这种逻辑可能会导致灾难性的回溯。
