Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何匹配“两个或多个单词”_Javascript_Regex - Fatal编程技术网

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

Javascript 如何匹配“两个或多个单词”,javascript,regex,Javascript,Regex,在给定的字符串中,我试图验证是否至少有两个单词,其中一个单词定义为任何非数字字符,例如 // Should pass Phil D'Sousa Billy - the - Kid // Should Fail Joe 454545 354434 我想这应该行得通: (\b\D*?\b){2,} 但事实并非如此。您忘了在单词之间留出空格: \b\D*?\b(?:\s+\b\D*?\b)+ ^^^ 我还看到了一些其他问题: 我也很怀疑你对这个词的定义。任何非数字字符也包

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

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

// Should Fail
Joe
454545 354434
我想这应该行得通:

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

但事实并非如此。

您忘了在单词之间留出空格:

\b\D*?\b(?:\s+\b\D*?\b)+
           ^^^
我还看到了一些其他问题:

我也很怀疑你对这个词的定义。任何非数字字符也包括标点和空格。那可能不是你真正的意思。您可能希望尝试这样定义单词:[^\d\s]+。这仍然允许单词包含标点符号,但不允许数字和空格

单词边界的使用存在问题-如果单词可以由标点组成,那么以标点开头或结尾的单词将没有单词边界,因此正则表达式将丢失它们


您正在搜索一个至少包含两个单词,可能还包含一些数字的字符串吗?或者字符串必须只包含单词而不包含任何数字吗?当前正则表达式正在查找两个连续的单词,但通常它们可能不是连续的。

您忘记在单词之间留出空格:

\b\D*?\b(?:\s+\b\D*?\b)+
           ^^^
我还看到了一些其他问题:

我也很怀疑你对这个词的定义。任何非数字字符也包括标点和空格。那可能不是你真正的意思。您可能希望尝试这样定义单词:[^\d\s]+。这仍然允许单词包含标点符号,但不允许数字和空格

单词边界的使用存在问题-如果单词可以由标点组成,那么以标点开头或结尾的单词将没有单词边界,因此正则表达式将丢失它们


您正在搜索一个至少包含两个单词,可能还包含一些数字的字符串吗?或者字符串必须只包含单词而不包含任何数字吗?当前您的正则表达式正在查找两个连续的单词,但通常它们可能不是连续的。

您可以全局搜索一个单词,并在找到匹配项时检查其长度:

如果找到两个或两个以上的单词,则表示您很好:

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。您必须确保使用的全局选项g来查找所有可能的匹配项

可以在正则表达式中调整单词的定义。诀窍是使用.match的length属性,但如果没有匹配项,则不应检查此属性,因为它会破坏脚本,因此必须执行if matches&&matches.length

另外,对于X字,修改上面的代码非常简单,其中X是数字或变量


如果找到匹配项,则可以全局搜索单词并检查长度:

如果找到两个或两个以上的单词,则表示您很好:

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。您必须确保使用的全局选项g来查找所有可能的匹配项

可以在正则表达式中调整单词的定义。诀窍是使用.match的length属性,但如果没有匹配项,则不应检查此属性,因为它会破坏脚本,因此必须执行if matches&&matches.length

另外,对于X字,修改上面的代码非常简单,其中X是数字或变量


对于你对这个词的定义来说,这似乎是可行的

/((\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)

对于你对这个词的定义来说,这似乎是可行的

/((\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)

看起来不错,b Herry,除了它与foo bar不匹配之外:

>>> !!"foo bar".match(r)
false

但是,2个或更多的单词>=2也将包括foo-bar。

看起来不错,b原因是它与foo-bar不匹配:

>>> !!"foo bar".match(r)
false

但是,2个或更多的单词>=2也将包括foo-bar。

不应包括在内;这就是为什么我要使用非数字字符类\DIs-a单词\D也包括标点符号…不应该是;这就是为什么我要使用非数字字符类\DIs-a单词\D还包括标点符号…有些名称包含标点符号:连字符、撇号等。但正则表达式只允许2个单词,而不允许2个或更多单词,不是吗?但我没有意识到\D包含空格。我怎么说非数字、非空格?@MarkByers最多匹配25个单词的正则表达式是什么?虽然单词可以是除空格以外的任何东西,但有些名称包含标点符号:连字符、撇号等。但是正则表达式只允许两个单词,而不允许两个或更多的单词,不是吗
? 但我没有意识到\D包含空格。我怎么说非数字、非空格?@MarkByers最多匹配25个单词的正则表达式是什么?虽然单词可以是除空格以外的任何东西,但你认为*应该是a+,这是对的。这也是我回答中的一个错误,所以我也应该纠正它。然而,这并不是OPs常规EPXpression的唯一问题。试试你的建议:54545 a 354434。我对OPs问题的理解是这应该失败。你是对的*应该是a+。这也是我回答中的一个错误,所以我也应该纠正它。然而,这并不是OPs常规EPXpression的唯一问题。试试你的建议:54545 a 354434。我对老年退休金计划问题的理解是,这应该失败。这是对另一个问题的评论,而不是回答。不,不是。它指出上面的re不适用于最简单的情况:两个单词之间用一个空格隔开。这是对另一个问题的评论,不是答案。不,不是。它指出上面的re不适用于最简单的情况:两个单词之间用一个空格隔开。