2014-02-13 30 views
0

我想用助手類驗證文本輸入。我開始用一種方法來證明與開頭大寫字母和最多20個字符長度的單一名稱:Android中的正則表達式出現意外結果

package xyz.helper; 
import java.util.regex.Pattern; 
public abstract class InputValidator { 
    public static boolean checkSingleName(String string) { 
     return Pattern.matches("^[A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜ]{1}[a-zàáâãäåæçèéêëìíîïñòóôõöøùúûü]{1,19}", string); 
    } 
} 

當我在活性試驗例如用「你好」,我回去FALSE和錯誤信息。我的正則表達式是否錯誤?

// Check User entries 
private boolean checkEntries() { 
    boolean validEntry = InputValidator.checkSingleName(title.toString()); 
     if (!validEntry) { 
      title.setError(getString(R.string.error_occasion)); 
      return false;  
     } 
     return true;  
} 

感謝任何提示

回答

0

我想你已經建立了句子的方式是不對的目前。我會嘗試這種方式:

return Pattern.compile("^[A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜ]{1}[a-zàáâãäåæçèéêëìíîïñòóôõöøùúûü]{1,19}").matcher("Hello").matches() 
+0

這也行不通。表達式在正則表達式工具中工作正常,雖然 – Cellist

+0

是的,這很奇怪,因爲我也在幾個正則表達式工具中測試了它,並且所有檢索到「真」。你能否爲了以防萬一,嘗試沒有特殊字符? 「^ [AZ] {1} [AZ] {1,19}」,但還是假 – nKn

+0

我試了一下。'^ [AZ] [AZ] {1,19} *' – Cellist

0

通常,在這樣的問題,這是你沒有顯示這是問題。

示範工作的Java實現的正則表達式(見http://ideone.com/nFPcic):

import java.util.*; 
import java.lang.*; 
import java.io.*; 
import java.util.regex.Pattern; 
/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     if(checkSingleName("Hello")) { 
     System.out.println("Yes that is valid"); 
     } 
     else { 
     System.out.println("No that is not valid"); 
     }// your code goes here 
    } 
    public static boolean checkSingleName(String string) { 
     return Pattern.matches("^[A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜ]{1}[a-zàáâãäåæçèéêëìíîïñòóôõöøùúûü]{1,19}", string); 
    } 
} 

這會打印出「是的,這是有效的」與"Hello"輸入字符串。當我給這個名字添加一個數字時,它會打印出「Not that is not valid」。如預期。

如果你得到不同的結果,這是因爲你沒有顯示的東西。 難道它是在你正在測試的字符串的開始/結尾有回車符,空格或製表符嗎?

順便說一句,你真的不需要在首字母大寫後面加{1};你的正則表達式是非常嚴格的。看到http://en.wikipedia.org/wiki/Category:Lowercase_proper_names_or_pseudonyms,甚至更好,http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ - 發人深省,有時也很有趣。

+1

謝謝。我沒有測試字符串。問題在這裏:checkSingleName(title.toString());它必須是title.getText()。toString()。 – Cellist

+0

@Cellist - 爲了能夠知道,我將不得不知道你的'title'的定義,它不在你共享的代碼中::-)「這就是你沒有顯示的那個問題」 。我休息我的情況。 – Floris

+1

問題解決:-) – Cellist