разрешить только буквенно-цифровые значения с использованием Java

1

мне нужно получить значение, которое только буквенно-цифровое, и это может быть что угодно, что попадает под это

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

  • 0
    Я бы не использовал Regex для этого, вы можете написать простую функцию, которая выполняет итерацию для каждого char строки и проверяет, находится ли он в нужном диапазоне:
Теги:

3 ответа

1
Лучший ответ

Вам нужно использовать lookahead для этого регулярного выражения:

^(?=.*?[a-zA-Z])(?=.*?[0-9])[0-9a-zA-Z]+$

Демо-версия RegEx

Lookaheads гарантирует, что во входной строке присутствует по крайней мере один алфавит и по меньшей мере одна цифра.

  • 0
    Большое спасибо за вашу поддержку :)
  • 0
    Пожалуйста, рад, что это сработало.
1

Вы можете использовать этот шаблон (без учета регистра):

\A(?>[0-9]+|[A-Z]+)[A-Z0-9]+\z

Идея состоит в том, чтобы использовать жадность и атомную группу, чтобы убедиться, что символы, сопоставленные в группе, отличаются от первого символа, выбранного вне группы.

Примечание: с помощью метода matches() вы можете удалить привязки, поскольку они неявны.

1

Вам не нужно включать начальные и конечные якоря при прохождении вашего регулярного выражения для 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]*

Ещё вопросы

Сообщество Overcoder
Наверх
Меню