мне нужно получить значение, которое только буквенно-цифровое, и это может быть что угодно, что попадает под это
1. asd7989 - true
2. 7978dfd - true
3. auo789dd - true
4. 9799 - false
5.any special characters - false
я попробовал следующее, но он не дает ожидаемого результата
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.struts.action.ActionMessage;
public class Test {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("^[0-9a-zA-Z]+$");
Matcher matcher = pattern.matcher("465123");
if(matcher.matches()) {
System.out.println("match");
}else{
System.out.println("not match");
}
}
}
результат должен быть not match
но я получаю как match
Вам нужно использовать lookahead для этого регулярного выражения:
^(?=.*?[a-zA-Z])(?=.*?[0-9])[0-9a-zA-Z]+$
Lookaheads
гарантирует, что во входной строке присутствует по крайней мере один алфавит и по меньшей мере одна цифра.
Вы можете использовать этот шаблон (без учета регистра):
\A(?>[0-9]+|[A-Z]+)[A-Z0-9]+\z
Идея состоит в том, чтобы использовать жадность и атомную группу, чтобы убедиться, что символы, сопоставленные в группе, отличаются от первого символа, выбранного вне группы.
Примечание: с помощью метода matches()
вы можете удалить привязки, поскольку они неявны.
Вам не нужно включать начальные и конечные якоря при прохождении вашего регулярного выражения для matches
методы.
[0-9a-zA-Z]*[a-zA-Z][0-9a-zA-Z]*[0-9][0-9a-zA-Z]*|[0-9a-zA-Z]*[0-9][0-9a-zA-Z]*[A-Za-z][0-9a-zA-Z]*
char
строки и проверяет, находится ли он в нужном диапазоне: