Android-регулярное выражение всегда возвращает false - PullRequest
2 голосов
/ 22 октября 2011

У меня проблемы с регулярным выражением, которое всегда возвращает false, хотя "http://developer.android.com/reference/java/util/regex/Pattern.html" заявляет, что не должно.

Я ввожу все виды специальных символов: "& $ @ R @" и b / b2 оба возвращают false в logcat. Строка, которую я помещаю в текст редактирования, даже отображается в 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);
    }

Ответы [ 6 ]

2 голосов
/ 23 октября 2011

Вместо matches(), который пытается сопоставить всю строку с шаблоном, вы можете использовать find(), который просто пытается найти любое вхождение шаблона. Источник

2 голосов
/ 23 октября 2011

Прежде всего, заглавные буквы W соответствуют любому не -буквенно-цифровому символу. Во-вторых, вы соответствуете только одному одному символу. Чтобы соответствовать этому, строка содержит только буквенно-цифровые символы, используйте следующее регулярное выражение:

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

Обратите внимание, что \w также соответствует подчеркиванию.

0 голосов
/ 23 октября 2011

\W (или как строковый литерал java, "\\W") соответствует одному несловесному символу. Метод matches() неявно закрепляет совпадение на обоих концах, как если бы вы действительно написали "\\A\\W\\z". Таким образом, вы получите соответствие, только если строка состоит из ровно одного несловесного символа. Если вы хотите сопоставить один или несколько символов, вы должны изменить регулярное выражение на

"\\W+"
0 голосов
/ 23 октября 2011

Метод Matcher, «match», пытается сопоставить Pattern со всей областью.Регулярное выражение "\ W" соответствует ОДНОМУ не алфавитно-цифровому символу.Другими словами, m.matches () вернет true, когда вы попытаетесь сопоставить его с ЕДИНСТВЕННЫМ специальным символом.Если вы попытаетесь сопоставить его с «& $ @ R @», он вернет false, поскольку строка содержит больше, чем один не буквенно-цифровой символ.

0 голосов
/ 22 октября 2011

Если вам нужен регулярный экспресс, который соответствует всем буквенно-цифровым символам , попробуйте [a-zA-Z0-9]*.Если вы хотите, чтобы соответствовало всем не буквенно-цифровым символам в строке , попробуйте это \\W*

0 голосов
/ 22 октября 2011

Я понятия не имею об Android, но это регулярное выражение:

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

Будет соответствовать любому не буквенно-цифровому символу.Если вы развернете его, оно будет выглядеть следующим образом:

[^a-zA-Z0-9_]

Если вы хотите сопоставить один буквенно-цифровой символ, включающий _, просто используйте:

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

, в противном случае используйте: Pattern p = Pattern.compile("[a-zA-Z0-9]");

...