【问题标题】:javascript check if value has at least 2 or more wordsjavascript 检查值是否至少包含 2 个或更多单词
【发布时间】:2014-08-16 22:32:46
【问题描述】:

我有一个字段,您可以在其中输入您的姓名并提交。我想要接收人的名字和姓氏,为此我需要检查该值是否包含至少 2 个单词。这是我现在正在使用的,但它似乎不起作用。

function validateNameNumber(name) {
    var NAME = name.value;
    var matches = NAME.match(/\b[^\d\s]+\b/g);
    if (matches && matches.length >= 2) {
        //two or more words
        return true;
    } else {
        //not enough words
        return false;
    }
}

【问题讨论】:

  • “似乎不起作用” 是什么意思?显示您的输入并解释预期和观察到的输出。你的代码对我有用。
  • @lvogel:他不是,我是因为他们的答案真的很糟糕。
  • @cookiemonster 所以请自行回答。
  • @lvogel:不,直到 OP 回答了我上面的问题。
  • 您可能应该寻找您想要而不是您不想要的字符的分组。例如,/\w+/g

标签: javascript regex string input


【解决方案1】:
str.trim().indexOf(' ') != -1 //there is at least one space, excluding leading and training spaces

【讨论】:

  • 验证用户输入名字和姓氏的绝佳答案。
【解决方案2】:

简单的解决方案(不是 100% 可靠,因为“foo   ”返回 4,正如 @cookiemonster 提到的那样):

var str = "Big Brother";
if (str.split(" ").length > 1) {
    // at least 2 strings
}

更好的解决方案:

var str = "Big Brother";
var regexp = /[a-zA-Z]+\s+[a-zA-Z]+/g;
if (regexp.test(str)) {
    // at least 2 words consisting of letters
}

【讨论】:

  • "foo ".split(' ').length; // 6
  • @cookiemonster 这就是我提供另一个解决方案的原因。
  • @cookiemonster 但我认为用户不太可能真正输入“Foo”,它说“输入你的名字”。
  • 您的其他解决方案在各个方面都不正确。测试你的答案。
  • 什么?你错过了问题的重点吗?他想验证有两个词。我举了一个使用您的解决方案给出误报的单词的示例。
【解决方案3】:

你可以使用 String.Split() 方法:

function validateNameNumber(name) {
    var NAME = name.value;
    var values = name.split(' ').filter(function(v){return v!==''});
    if (values.length > 1) {
        //two or more words
        return true;
    } else {
        //not enough words
        return false;
    }
}

如果您将“John Doe”作为名称值传递,值将等于 {"john", "doe"}

http://www.w3schools.com/jsref/jsref_split.asp

编辑:添加过滤器以删除空值。来源:remove an empty string from array of strings - JQuery

【讨论】:

  • 被否决没有问题,但解释为什么会很好。似乎很有趣,4 个答案中有 3 个都被一次否决了,没有任何解释......
  • "foo ".split(' ').length; // 6
【解决方案4】:

可能不是总体上最好的解决方案(请参阅其他答案),但它显示了如何计算正则表达式匹配字符串的次数:

function validateNameNumber(name) {
    var nameValue = name.value;
    var regexp = /\b[^\d\s]+\b/g;
    var count = 0;
    while (regexp.exec(nameValue)) ++count;
    if (count >= 2) {
        //two or more words
        return true;
    } else {
        //not enough words
        return false;
    }
}

【讨论】:

    【解决方案5】:

    从您的 sn-p 更改此行

    var matches = NAME.match(/\b[^\d\s]+\b/g);
    

    到这里

    var matches = NAME.match(/\S+/g);
    

    或者到这个,如果数字应该被排除在外

    var matches = NAME.match(/\b([a-z]+)\b/gi);
    

    旁注(有趣):您的 sn-p 工作正常。检查jsBin

    【讨论】:

    • 为什么?它似乎想排除数字。您只是在更改标准,但最终是相同的解决方案。
    • @cookiemonster (1) 他最后说它似乎不起作用,这足以不分析每一行 (2) 我看到其他答案是即使他们实际上没问题(没有看到 OP 的代表)也被否决了,所以(3)我想让我们给出一个不同的答案。
    • 其他答案不好,但你的更好,这就是我没有投反对票的原因。但是,我认为您不一定需要更改标准,尽管我认为 OP 最好详细解释确切的标准。
    • @cookiemonster 有趣的是 OPs sn-p 工作正常。检查这个jsBin 或者我错过了什么:)
    • 是的,我知道。他声称它不适用于某些输入,但对我来说效果很好。
    【解决方案6】:

    我会通过运行 for 循环来检查空格。

    var correctFormat = false;
    for (var i = 0; i = i < name.length; i++) {
        if (name[i] === " ") {
           correctFormat = true;
        }
    }
    if (correctFormat === false) {
        alert("You entered an invalid name");
        return false;
    } else {
        return true;
    }
    

    如果名字没有空格,知道名字和姓氏之间有空格,那就alert("You entered an invalid name");

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2017-10-16
      • 2013-08-11
      • 2019-05-29
      • 1970-01-01
      • 2012-03-26
      • 2016-07-20
      • 2017-10-17
      • 2012-08-05
      相关资源
      最近更新 更多