2011-10-22 88 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+" 
相关问题