“25 个字或更少”的正则表达式?
Regex for "25 words or fewer"?
我有一个 google 形式的问题,我想为其设置响应验证以匹配“不超过 25 个字”。
我试过的正则表达式是 ^(\b.+){1,25}$
但这不起作用:一个段落中超过 25 个单词是有效的,2 个十个单词的段落是无效的。
我确实想允许多个 lines/paragraphs 因为人就是人,如果不允许,他们只会感到困惑。
这些应该通过:
- 一二三?四五六七八九十!
- 一二三?四五六,七八九十!一二三?四五六七八九十!
- 这里有 25 个简单的单词,分为三个单独的段落。
一二三?四五六七八九十!
一二三?四五
- !bang !bang 这是以非单词字符开头的单词
- 这里是一个以单词字符结尾的句子
- 这是一个以非单词字符结尾的句子!
这些应该会失败:
- 一二三?四五六,七八九十!一二三?四五六,七八九十!一二三?四五六七八九十!
- 一二三?四五六七八九十!
一二三?四五六七八九十!
一二三?四五六七八九十!
建议?
假设 ^
和 $
没问题:
^(([^\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*$/
我有一个 google 形式的问题,我想为其设置响应验证以匹配“不超过 25 个字”。
我试过的正则表达式是 ^(\b.+){1,25}$
但这不起作用:一个段落中超过 25 个单词是有效的,2 个十个单词的段落是无效的。
我确实想允许多个 lines/paragraphs 因为人就是人,如果不允许,他们只会感到困惑。
这些应该通过:
- 一二三?四五六七八九十!
- 一二三?四五六,七八九十!一二三?四五六七八九十!
- 这里有 25 个简单的单词,分为三个单独的段落。
一二三?四五六七八九十!
一二三?四五 - !bang !bang 这是以非单词字符开头的单词
- 这里是一个以单词字符结尾的句子
- 这是一个以非单词字符结尾的句子!
这些应该会失败:
- 一二三?四五六,七八九十!一二三?四五六,七八九十!一二三?四五六七八九十!
- 一二三?四五六七八九十!
一二三?四五六七八九十!
一二三?四五六七八九十!
建议?
假设 ^
和 $
没问题:
^(([^\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*$/