我需要一个正则表达式来检查 textarea 表单的输入并检测表单是否包含超过 999 个单词。这是与语言无关的,即我正在使用一个接受正则表达式进行验证的表单插件。
5 回答
您所需要的只是针对输入字符串测试简单的正则表达式匹配。使用正则表达式模式
(?:\b\w+(?:\W+|$)){1000}
如果您需要添加 unicode 支持,请使用模式
(?:\b[\w\p{L}]+(?:[^\w\p{L}]+|$)){1000}
我怀疑每个人都让这变得比需要的更困难。你真的关心“词”是否是语言意义上的词吗?还是会这样做?
\S+(?:\s+\S+){999}
如果是这样,并且您的正则表达式风格支持所有格量词,那么我推荐的实际正则表达式是:
\S++(?:\s++\S++){999}
当无法匹配时,这将更快地失败。例如,当我尝试在 RegexBuddy 中匹配一个正好包含 999 个单词的字符串时,第一个正则表达式需要 21,870 步才能失败,而所有格版本只需要 3,996 步。如果你没有所有格量词,但你有原子组,这需要 4,008 步才能失败:
\S+(?>\s+\S+){999}
鉴于您使用正则表达式来验证用户输入,性能可能无关紧要。我提出它是因为在这种情况下很容易创建一个锁定你的机器的正则表达式。这通常发生在找不到匹配项的情况下。当您测试正则表达式时,您应该至少有与匹配的测试一样多的非匹配测试。
因为@Asad 似乎很害羞回答
(\b\w+\b\s+){1000,}
它匹配一个单词边界 ( \b
) 后跟一个可以成为单词一部分的字符一次或多次 ( \w+
) 后跟一个单词边界,以及一个或多个空格字符 ( \b\s+
- 空格也可以是制表符等...)至少 1000 次 ( (...){1000,}
)
使用前瞻:
^(?=(.*\b\w+\b){1000,})
请注意,这是一个以盎格鲁为中心的解决方案。对于其他语言,\w
需要用“非标点符号或空格”正则表达式或类似的替换。此外,这不适合单词中的撇号。
这是一个计算非空白块数的表达式。
^(?>\s*\S+){1000,}\s*$
这不是一个完美的解决方案,因为它在以下字符串“Ambassador T'Pel”中计算了 2 个单词,而实际上有 3 个单词。但它使正则表达式非常简单,它可能足以满足您的要求。
这个正则表达式也非常快,因为它将回溯保持在最低限度。