Java-неизвестные персонажи, проходящие как [a-za-z0-9]*?

StackOverflow https://stackoverflow.com/questions/4681289

Вопрос

Я не эксперт в Regex, но мне нужно проанализировать какой-то вход, у меня нет контроля, и убедиться, что я отфильтровал любые строки, у которых нет AZ и/или 0-9.

Когда я запускаю это,

Pattern p = Pattern.compile("^[a-zA-Z0-9]*$"); //fixed typo
if(!p.matcher(gottenData).matches())
       System.out.println(someData); //someData contains gottenData

Определенные пространства + неизвестный символ каким -то образом проскользнул через фильтр (Gottendata - это красный прямоугольник): screenshot

Если вам интересно, это также отображает текст, это не все.

На данный момент я не возражаю против [?] До тех пор, пока он также содержит некоторую строку вместе с ней.

Пожалуйста помоги.

РЕДАКТИРОВАТЬ] Насколько я могу судить по (очень большому) входу, [?] И либо белые пространства, либо вообще ничего; Может быть, есть какая -то проблема кодировки, также, возможно, что -то связано с узлами #Text (ввод - XML)

Это было полезно?

Решение

Квантификатор * соответствует «нулю или более», что означает, что он будет соответствовать строке, которая не содержит ни одного из символов в вашем классе. Попробуйте + квантификатор, что означает «один или несколько»: ^[a-zA-Z0-9]+$ будет соответствовать струнам, состоящим только из буквенно -цифровых персонажей. ^.*[a-zA-Z0-9]+.*$ будет соответствовать любой строке, содержащей один или несколько буквенно -цифровых символов, хотя ведущий.* сделает ее намного медленнее. Если вы используете Matcher.lookingAt() вместо Matcher.matches, это не потребует полного сопоставления строки, и вы можете использовать регуляцию [a-zA-Z0-9]+.

Другие советы

У вас есть ошибка в вашей корпорации: вместо [a-zA-z0-9]* так должно быть [a-zA-Z0-9]*.

Тебе не нужно ^ а также $ Вокруг корпорации.Matcher.matches() Всегда соответствует полной строке.

String gottenData = "a ";
Pattern p = Pattern.compile("[a-zA-z0-9]*");
if (!p.matcher(gottenData).matches())
    System.out.println("doesn't match.");

это отпечатки "doesn't match."

Правильный ответ - это комбинация вышеуказанных ответов. Сначала я представляю, что ваш предполагаемый матч персонажа-[A-za-Z0-9]. Обратите внимание, что AZ не так плохо, как вы думаете, что это включает в себя все символы в диапазоне ASCII между A и Z, которые являются буквами плюс несколько дополнительных (в частности [, ,],^, _, `).

Вторая потенциальная проблема, как упомянул Мартин, заключается в том, что вам, возможно, придется поместить квалификаторы начала и окончания, если вы хотите, чтобы строка состоит только из букв и чисел.

Наконец, вы используете оператор *, что означает 0 или более, поэтому вы можете сопоставить 0 символов и совпадений, вернуть True, поэтому ваш шаблон будет соответствовать любому вводу. Вам нужен + квантификатор. Поэтому я отправлю шаблон, который вы, скорее всего, ищете:

^[a-za-z0-9]+$

Вы должны изменить режим regexp на "^[a-zA-Z0-9]*$" Чтобы убедиться, что вы соответствуете всей строке

Похоже, это должно быть "a-za-z0-9", а не "a-za-z0-9", попробуйте исправить это ...

Кто -нибудь подумал о том, чтобы добавить место в корпус [a-zA-Z0-9 ]*. Анкет Это должно соответствовать любому нормальному тексту с частями, номером и пространствами. Если вы хотите цитаты и другие специальные Chars, добавьте их в корпус.

Вы можете быстро проверить свою форму на http://www.regexplanet.com/simple/

Вы можете проверить входное значение содержится строка и числа? с использованием regex ^[a-za-z0-9]*$

Если ваше значение просто содержало номера, чем его шоу соответствие т.е. RIZ99, RIZ99Z, иначе он покажет не соответствует т.е. 99z., Riz99.z, Riz99.9

Пример кода:

if(e.target.value.match('^[a-zA-Z0-9]*$')){
            console.log('match')
          }
          else{
            console.log('not match')
          }
}

онлайн -рабочее пример

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top