2011-10-22 81 views
2

即使 「http://developer.android.com/reference/java/util/regex/Pattern.html」聲明它不應該出現,我仍然遇到正則表達式始終返回false的問題。Android正則表達式總是返回false

我正在輸入各種特殊字符「& $ @ R @」,並且b/b2在logcat中都返回false。我放入編輯文本的字符串甚至以logcat的形式顯示爲我輸入的確切字符串。任何人都有一個想法,爲什麼它不會匹配字母數字字符?

代碼:

EditText et1 = (EditText) findViewById(R.id.editText1); 
    String et1Text = et1.getText().toString(); 
    int et1Length = et1.getText().toString().length(); 
    EditText et2 = (EditText) findViewById(R.id.editText2); 
    String et2Text = et2.getText().toString(); 
    int et2Length = et2.getText().toString().length(); 

    Pattern p = Pattern.compile("\\W"); 
    Log.d(TAG,et1Text); 
    Matcher m = p.matcher(et1Text); 
    boolean b = m.matches(); 
    if (b == true){ 
     Log.d(TAG,"True"); 
    } 
    else { 
     Log.d(TAG,"False"); 
    } 
    Log.d(TAG,et2Text); 
    Matcher m2 = p.matcher(et2Text); 
    boolean b2 = m2.matches(); 
    if (b2 == true){ 
     Log.d(TAG,"True"); 
    } 
    else { 
     Log.d(TAG,"False"); 
    } 

    if (et1Length < 4 | et1Length > 15 | et2Length < 4 | et2Length > 15){ 
     Log.d(TAG,"Length dialog"); 
     dialog(1); 
    } 

    if (b==true | b2==true){ 
     Log.d(TAG,"Special char dialog"); 
     dialog(1); 
    } 

回答

2

而不是matches()它試圖匹配整個字符串模式,你可以使用find()只是試圖找到任何模式的發生。 Source

+0

我試過這件事的第一件事。謝謝。如果有人對我爲什麼不應該使用這種語法有任何意見,請告訴我。謝謝。 –

0

我不知道關於Android,但這個表達式:

Pattern p = Pattern.compile("\\W"); 

將匹配任何字母數字字符。如果你想擴展它,它應該是這樣的:

[^a-zA-Z0-9_] 

如果你想匹配單個字母數字字符,包括_只需使用:

Pattern p = Pattern.compile("\\w"); 

其他用途:Pattern p = Pattern.compile("[a-zA-Z0-9]");

0

如果您想要一個正規的快遞,匹配所有字母數字字符嘗試[a-zA-Z0-9]*。如果你想匹配字符串中的所有非字母數字字符試試這個\\W*

+0

的方括號在你的第二個正則表達式是多餘的,而那些反斜線至少一個已去。在「原始」形式中,正則表達式將是'\ W *',並且作爲Java字符串文字,'「\\ W *」'。 (但我認爲'+'比'*'更合適)。 –

+0

哎呀,謝謝你的收穫。 –

0

匹配器的方法,「匹配」,試圖來匹配整個區域格局。正則表達式「\ W」匹配單個非字母數字字符。換句話說,當你嘗試將它匹配到單個特殊字符時,m.matches()將返回true。如果您嘗試將它與「& $ @ R @」相匹配,則它將返回false,因爲該字符串不僅包含單個非字母數字字符。

2

首先大寫W匹配任何字母數字字符。其次你只匹配一個單個字符。以匹配字符串只包含字母數字字符使用正則表達式如下:

String pattern = "[\\w]*"; 

注意\w也匹配下劃線。

+0

我會在上面的代碼中添加那個?這是一個字符串,我正在閱讀的模式需要模式。也是的,我試圖確保整個字符串只是字母數字。 –

+0

在你構造模式的地方,你爲它分配一個字符串:'Pattern p = Pattern.compile(「\\ W」);'。只需用上面提到的字符串替換「\\ W」:) – Marcus

+0

您給出的這個例子實際上與我所需要的完全相反。如果我(b == false | b2 == false),它不會以不好的方式工作。它繼續前進,並與find()一起。謝謝你的幫助。 –

0

\W(或作爲java字符串文字,"\\W")匹配一個非單詞字符。 matches()方法隱式錨定兩端的匹配,就好像你真的寫了"\\A\\W\\z"一樣。所以如果字符串恰好包含一個非單詞字符,則只會得到一個匹配。如果你想匹配一個或多個字符,你應該正則表達式改爲

"\\W+" 
相關問題