首页 > 解决方案 > 匹配 FOO 连字符和数字的复杂正则表达式

问题描述

我们正在尝试创建一个正则表达式,它必须匹配以下字符串:

它必须满足以下条件:

我们已经想出了这样的东西

^FOO(-{0,1}[\d]+){6,50}$

但似乎 {6,50} 将限制设置为 50 不是针对字符串的总长度,而是针对此捕获组的重复

(-{0,1}[\d]+)

你能请教吗?

标签: c#regex

解决方案


您可以使用

^(?=.{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+)*$它也可以工作并且更短,但是在量化组内使用单个强制性模式和其他可选模式是不好的。在这个确切的情况下,它是可以的,但在其他情况下,遵循这个逻辑可能会导致灾难性的回溯。


推荐阅读