正则表达“25字以内”?

时间:2017-08-03 02:58:38

标签: regex google-form

我在google表单中有一个问题,我希望将响应验证设置为“25个字以内”。

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

我确实想要允许多行/段,因为人是人,如果不允许,他们会感到困惑。

这些应该通过:

  • 一两三?四五六,七八九十!
  • 一两三?四五六,七八九十!一二三?四五六,七八九十!
  • 这里有三十五个单独的段落中的二十五个简单词 一二三?四五六,七八九十! 一二三?四五
  • !bang!bang这里是以非单词字符开头的单词
  • 这是一个以单词字符
  • 结尾的句子
  • 这是一个以非单词字符结尾的句子!

这些应该失败:

  • 一两三?四五六,七八九十!一二三?四五六,七八九十!一二三?四五六,七八九十!
  • 一两三?四五六,七八九十! 一二三?四五六,七八九十! 一二三?四五六,七八九十!

建议?

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模式匹配空格)