2014-10-30 96 views
0
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語句始終爲false,因此此方法會停留在常量循環中。我已經試過.matches(),而且我在Interent上發現的東西迄今爲止都沒有幫助。任何想法爲什麼?感謝您的幫助提前。String.contains總是顯示爲假

編輯:我剛剛注意到我在整理項目,即試圖打印「姓名」後只顯示名字,最後從不打印。有什麼辦法可以讓'name'字符串包含這兩個字符?

回答

10

String.contains不使用正則表達式 - 它只是一個檢查字符串是否包含另一個,在「foobar的」包含「OOB」的方式。

這聽起來像你要檢查name只有包含字母,在這種情況下,你應該檢查是這樣的:

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

+(而不是*)將檢查它的非空; ^$將檢查除了字母之外什麼也沒有。

如果你希望它是一個完整的名字,但是,您可能要允許空格,連字符和撇號:

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

還要考慮重音符號 - 和標點符號從其他語言。

+0

此外,在美國至少,有些地方有鬆懈[法律](HTTP://en.wikipedia。 org/wiki/Naming_law)關於虐待兒童的命名,並允許數字和其他古怪:「......一些州禁止使用數字或象形圖,一些州禁止使用淫穢,還有一些州,肯塔基州例如,沒有任何命名法。「 – azurefrog 2014-10-30 23:05:46

+0

工作完美,謝謝你的詳細解釋。只要它允許我將它標記爲答案。 – DJOwen 2014-10-30 23:06:08

+0

@azurefrog:好點。我想這真的取決於上下文... – 2014-10-30 23:06:46

0

容易。 .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)){ 

    } 
}