Java-неизвестные персонажи, проходящие как [a-za-z0-9]*?
-
10-10-2019 - |
Вопрос
Я не эксперт в 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 - это красный прямоугольник):
Если вам интересно, это также отображает текст, это не все.
На данный момент я не возражаю против [?] До тех пор, пока он также содержит некоторую строку вместе с ней.
Пожалуйста помоги.
РЕДАКТИРОВАТЬ] Насколько я могу судить по (очень большому) входу, [?] И либо белые пространства, либо вообще ничего; Может быть, есть какая -то проблема кодировки, также, возможно, что -то связано с узлами #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')
}
}