【问题标题】:Android regex always returning falseAndroid 正则表达式总是返回 false
【发布时间】:2011-12-13 07:31:00
【问题描述】:

我遇到了 regex 总是返回 false 的问题,即使 “http://developer.android.com/reference/java/util/regex/Pattern.html”声明不应该。

我正在输入各种特殊字符“&$@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);
    }

【问题讨论】:

    标签: java regex matcher


    【解决方案1】:

    您可以使用find() 而不是尝试将整个字符串与模式匹配的matches(),它只是尝试查找模式的任何出现。 Source

    【讨论】:

    • 我尝试的第一件事是有效的。谢谢你。如果有人对我为什么不应该使用这种语法有任何见解,请告诉我。谢谢。
    【解决方案2】:

    首先,大写的W 匹配任何-字母数字字符。其次,您只匹配 一个 单个字符。要匹配该字符串仅包含字母数字字符,请使用以下正则表达式:

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

    注意\w 也匹配下划线。

    【讨论】:

    • 在上面的代码中我应该在哪里添加?这是一个字符串,我正在阅读模式需要是模式。也是的,我试图确保整个字符串都是字母数字的。
    • 在构造模式的位置为它分配一个字符串:Pattern p = Pattern.compile("\\W");。只需将“\\W”替换为上述字符串即可:)
    • 你给出的这个例子实际上与我所需要的完全相反。如果我(b==false |b2==false),它会起作用。它继续使用 find()。感谢您的帮助。
    【解决方案3】:

    Matcher 方法“matches”尝试将 Pattern 与整个区域进行匹配。正则表达式“\W”匹配单个非字母数字字符。换句话说,当您尝试将 m.matches() 与 SINGLE 特殊字符匹配时,它将返回 true。如果您尝试将其与“&$@R@”匹配,它将返回 false,因为该字符串包含的不仅仅是一个非字母数字字符。

    【讨论】:

      【解决方案4】:

      我不知道 android 但这个正则表达式:

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

      将匹配任何字母数字字符。如果你想扩展它,它会是这样的:

      [^a-zA-Z0-9_]
      

      如果你想匹配包括 _ 在内的单个字母数字字符,只需使用:

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

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

      【讨论】:

        【解决方案5】:

        \W(或作为 java 字符串文字,"\\W")匹配一个非单词字符。 matches() 方法在两端隐式锚定匹配,就好像你真的写了"\\A\\W\\z"。因此,只有当字符串完全由 one 非单词字符组成时,您才会得到匹配。如果要匹配一个或多个字符,则应将正则表达式更改为

        "\\W+"
        

        【讨论】:

          【解决方案6】:

          如果您想要一个匹配所有字母数字字符的正则​​表达式,请尝试[a-zA-Z0-9]*。如果你想匹配字符串中的所有非字母数字字符试试这个\\W*

          【讨论】:

          • 第二个正则表达式中的方括号是多余的,至少要去掉其中一个反斜杠。在“原始”形式中,正则表达式为\W*,作为Java 字符串文字,"\\W*"。 (但我认为+* 更合适。)
          猜你喜欢
          • 2012-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-26
          • 1970-01-01
          • 2015-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多