【问题标题】:String.contains always appears falseString.contains 总是显示为 false
【发布时间】:2014-12-27 04:35:34
【问题描述】:
public final void nameErrorLoop () {
    while (error) {
        System.out.println("Enter the employee's name.");
        setName(kb.next()); 
        if (name.contains("[A-Za-z]")) {
            error = false; 
        }
        else {
            System.out.println("The name can only contain letters.");
        }
    }
    error = true; 
}

尽管类似的设置在不同的方法中工作,但由于 if 语句始终为假,该方法会陷入一个恒定循环。我试过.matches(),到目前为止,我在Interent 上发现的任何东西都没有帮助。任何想法为什么?提前感谢您的帮助。

编辑:我刚刚在完成项目时注意到,稍后尝试打印“名称”只显示名字,而最后一个永远不会打印。有什么办法可以让“名称”字符串同时包含两者?

【问题讨论】:

    标签: java string contains


    【解决方案1】:

    String.contains 不使用正则表达式 - 它只是检查一个字符串是否包含另一个字符串,就像“foobar”包含“oob”一样。

    听起来您想检查 name only 是否包含字母,在这种情况下,您应该检查以下内容:

    if (name.matches("^[A-Za-z]+$"))
    

    +(而不是*)将检查它是否为非空; ^$ 将检查除了字母之外什么都没有。

    但是,如果您希望它是一个全名,您可能希望允许使用空格、连字符和撇号:

    if (name.matches("^[-' A-Za-z]+$"))
    

    还要考虑重音字符 - 和其他语言的标点符号。

    【讨论】:

    • 另外,至少在美国,有些地方对儿童的辱骂性命名并允许数字和其他怪异行为松懈laws:“......有些州禁止使用数字或象形图。A很少有州禁止使用淫秽内容。还有一些州,例如肯塔基州,没有任何命名法。”
    • 效果很好,感谢您的详尽解释。我会尽快将其标记为答案。
    • 幸运的是,这只是一个家庭作业。我不必担心州法律,只需担心一般的命名约定。
    【解决方案2】:

    简单。 .contains() 不是你想的那样。它进行精确的字符串匹配。

        "anything".contains("something that's not a regular expression");
    

    要么用这个

    Pattern p2=Pattern.compile("[A-Za-z]+");//call only once
    p2.matcher(txt).find();//call in loop
    

    或者这个:

        for(char ch: "something".toCharArray()){
            if(Character.isAlphabetic(ch)){
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2020-10-31
      • 2017-01-18
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 2016-04-05
      相关资源
      最近更新 更多