“25 个字或更少”的正则表达式?

Regex for "25 words or fewer"?

我有一个 google 形式的问题,我想为其设置响应验证以匹配“不超过 25 个字”。

我试过的正则表达式是 ^(\b.+){1,25}$ 但这不起作用:一个段落中超过 25 个单词是有效的,2 个十个单词的段落是无效的。

我确实想允许多个 lines/paragraphs 因为人就是人,如果不允许,他们只会感到困惑。

这些应该通过:

这些应该会失败:

建议?

假设 ^$ 没问题:

^(([^\s]+)\s?){1,25}$

看起来尾部 \s? 触发了灾难性的回溯,没有它的重写会使它更长一些,因为第一个单词和接下来的 24 个单词是分开匹配的:

^[^\s]+(\s([^\s]+)){0,24}\s?$

(\s 模式匹配空格)

您正在寻找

/^(?:\s*\S+(?:\s+\S+){0,24})?\s*$/

避免 catastrophic backtracking 在重复中总是完全匹配一个完整的单词。它是 (\s+\S+){0,25},第一次重复被排除在外以允许任何空格,包括 none、(*) 而不是至少一个 (+).

您还可以使用更容易阅读的 (\s*\S+){0,25} 和否定前瞻来确保匹配整个单词:

/^(?:\s*\S+(?!\S)){0,25}\s*$/

或者,如果您的正则表达式引擎支持,possessive quantifiers ({0,25}+) 是最佳解决方案。

当然,如果需要,您可以将 \s/\S 换成 \W/\w,然后也可以使用 word boundary前瞻的:

/^(?:\W*\w+\b){0,25}\W*$/