Skip to main content
 首页 » 编程设计

c#之匹配 FOO 连字符和数字的复杂正则表达式

2024年02月25日29飞鱼

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

  • 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+)*$ 也可以工作并且更短,但是使用单个强制模式与量化组内的其他可选模式。在这种情况下,没问题,但在其他情况下,遵循这种逻辑可能会导致灾难性的回溯。