在一个给定的字符串中,我试图验证至少有两个单词,其中一个单词被定义为任何非数字字符,例如
// Should pass
Phil D'Sousa
Billy - the - Kid
// Should Fail
Joe
454545 354434
我认为这应该有效:
(\b\D*?\b){2,}
但事实并非如此。
答案 0 :(得分:9)
您忘记在“单词”之间留出空格:
\b\D*?\b(?:\s+\b\D*?\b)+
^^^
我可以看到许多其他问题:
我也很怀疑你对“单词”的定义。任何非数字字符也包括标点符号和空格。这可能不是你真正的意思。您可能希望尝试定义这样的单词:[^\d\s]+
。这仍然允许单词包含标点符号,但它不允许使用数字和空格。
使用单词边界时出现问题 - 如果单词可以包含标点符号,那么在标点符号开头或结尾的单词将没有单词边界,因此您的正则表达式将会错过它们。
您是否正在搜索包含至少两个“单词”的字符串,可能还包含一些数字?或者字符串必须只包含“单词”而字符串中的任何位置都没有数字?目前你的正则表达式正在寻找两个连续的“单词”,但一般来说它们可能不是连续的。
答案 1 :(得分:3)
如果找到匹配项,您可以全局搜索“字词”并检查 .match()
的长度:
如果找到两个或两个以上的单词,那你很好:
var matches = string.match(/\b[^\d\s]+\b/g);
if ( matches && matches.length >= 2 )
{ /* Two or more words ... */ };
您可以将单词定义为\b[^d\s]+\b
,即单词边界\b
,一个或多个非数字和非空白[^d\s]+
,以及另一个单词边界\b
。您必须确保使用 regex 的全局选项g
来查找所有可能的匹配项。
您可以调整正则表达式中单词的定义。诀窍是使用length
的{{1}}属性,但如果没有匹配则不应检查此属性,因为它会破坏脚本,所以你必须{{1} }}
此外,修改.match()
字的上述代码非常简单,其中if (matches && matches.length ...)
是数字或变量。
答案 2 :(得分:1)
这似乎适用于您对“单词”的定义。
/((\W|^)\D+?(\W|$).*){2}/
以下是您的四个示例,以及编辑和修复此答案后添加的一些示例:
>>> r = /((\W|^)\D+?(\W|$).*){2}/
/((\W|^)\D+?(\W|$).*){2}/
>>> !!"Phil D'Sousa".match(r)
true
>>> !!"Billy - the - Kid".match(r)
true
>>> !!"Joe".match(r)
false
>>> !!"54545 354434".match(r)
false
>>> !!"foo bar baz".match(r)
true
>>> !!"123 foo 456".match(r)
false
>>> !!"123 foo 456 bar".match(r)
答案 3 :(得分:0)
看起来不错,bcherry除了它与“foo bar”不匹配的事实:
>>> !!"foo bar".match(r)
false
但是,“2个或更多单词”(> = 2)也会包含“foo bar”。