我在google表单中有一个问题,我希望将响应验证设置为“25个字以内”。
我试过的正则表达式是^(\b.+){1,25}$
,但这不起作用:一个段落中超过25个单词正在验证,2个十个单词段落无效。
我确实想要允许多行/段,因为人是人,如果不允许,他们会感到困惑。
这些应该通过:
这些应该失败:
建议?
答案 0 :(得分:2)
您正在寻找
/^(?:\s*\S+(?:\s+\S+){0,24})?\s*$/
通过始终在重复中完全匹配一个完整单词来避免catastrophic backtracking。它的(\s+\S+){0,25}
第一次重复考虑因素允许任何空格,包括无,(*
)而不是至少一个(+
)。
你也可以使用更容易阅读(\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*$/
答案 1 :(得分:0)
假设^
和$
没问题:
^(([^\s]+)\s?){1,25}$
看起来尾随的\s?
触发了灾难性的回溯,重写没有它会让它变得更长,因为第一个单词和下一个单独的单独匹配:
^[^\s]+(\s([^\s]+)){0,24}\s?$
(\ s模式匹配空格)