限制多个组中的字符总数

Restricting overall number of characters within multiple groups

我正在尝试匹配以下内容:

五个大写字符,后跟可选的小数点(最多十位数字,包括 ,),后跟自由文本,所有这些最多可以有 40 个字符。

我得到了以下结果: ^([A-Z]{5}(\d*,\d{1,})?.*)$ 这有点符合我的模式,但我在限制小数点字符数(最多 10 个)和字符总数(最多 40 个)方面遇到了问题。

我一直在看前瞻,但我做错了,因为它不起作用。 对于我的小数:(?=.{0,10}(\d*,\d{1,}))

试试这个:

(?=.{0,40})^([A-Z]{5}[0-9]{0,10}.{0,35})$

一个选项可能是使用 2 个正前瞻,一个断言字符总数,另一个断言 10 位数字,包括仅在 5 个大写字符之后匹配该数字格式的逗号。

^[A-Z]{5}(?=.{0,35}$)(?:(?=[,\d]{1,10}(?![,\d]))\d+(?:,\d+)?(?![\d,]))?(?!\d).*$

说明

  • ^ 字符串开头
  • [A-Z]{5} 匹配 5 个大写字符 A-Z
  • (?=.{0,35}$) 断言最多 35 个字符,直到字符串结束
  • (?:非捕获组
    • (?=[,\d]{1,10}(?![,\d])) 正面前瞻,断言直接在右边的是数字或逗号的 1-10 倍,不直接跟数字或逗号
    • \d+(?:,\d+)? 匹配 1+ 个带可选小数部分的数字
    • (?![\d,]) 否定前瞻,断言直接在右边的不是数字或逗号
  • )? 关闭组并使其可选
  • (?!\d) 否定前瞻,断言不是右边的数字
  • .* 匹配除换行符之外的任何字符 0 次以上
  • $ 字符串结束

Regex demo