如何匹配“两个或多个单词”

时间:2010-09-19 18:05:41

标签: javascript regex

在一个给定的字符串中,我试图验证至少有两个单词,其中一个单词被定义为任何非数字字符,例如

// Should pass
Phil D'Sousa
Billy - the - Kid

// Should Fail
Joe
454545 354434

我认为这应该有效:

(\b\D*?\b){2,}

但事实并非如此。

4 个答案:

答案 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 ...)是数字或变量。

<强> jsFiddle example with your 4 examples

答案 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个或更多单词”(&gt; = 2)也会包含“foo bar”。