首页 > 文章列表 > 正则表达式中的嵌套重复性质

正则表达式中的嵌套重复性质

315 2024-03-03
问题内容

我正在尝试在 go 中创建一个正则表达式,最多匹配 50 个由空格分隔的单词,其中每个单词是 1-32 个“a” 我正在使用以下正则表达式

regexp.compile(`^(a{1,32}s?){1,50}$`)

我收到以下错误

error parsing regexp: invalid repeat count: `{1,50}`

我注意到它最多可以重复 31 次,就像这样

r, err := regexp.Compile(`^(a{1,32}s?){1,31}$`)

参见 https://go.dev/play/p/rlnrox9-57_m


正确答案


Go 的 regexp 引擎有 一个限制< /a> 其中顶层和任何内部重复的组合不得超过最内部重复部分的 1000 个副本。 re2 语法规范中记录了这一点。

在您的情况下,最多 31 个有效,因为内部 32 * 外部 31 = 992。32 * 32 = 1024 以及 32 * 50 = 1600 超出该限制将不起作用。

解决方法是将表达式拆分为多个部分:^(a{1,32}s?){1,31}(a{1,32}s?){0,19}$