Как я могу использовать шаблон и сопоставитель с типами StringBuffer или char[] вместо String?

#java #string #matcher #stringbuffer

#java #строка #сопоставитель #stringbuffer

Вопрос:

Как я могу использовать подобный метод

 private boolean respectPattern(String password) {
  Pattern passwordPattern = Pattern.compile(
    "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[.@$!%*?amp;])[A-Za-z\d@$!%*?amp;.]{8,}$",
    Pattern.CASE_INSENSITIVE);
  Matcher matcher = passwordPattern.matcher(password);
  return matcher.find();
}
  

Если я заменю password тип на StringBuffer или char[] ?

Ответ №1:

Метод matcher() в классе java util.regex.Pattern принимает один параметр, тип которого — CharSequence, который является интерфейсом. Согласно javadoc, существует несколько реализующих классов, в том числе StringBuffer . Если ни одна из существующих реализаций не подходит для ваших нужд, вы всегда можете написать свою собственную реализацию.

Например, используя CharBuffer

 CharBuffer cb = CharBuffer.allocate(11);
cb.put(new char[]{'S','e','c', 'r', 'e', 't', ' ', 'P', 'a', 's', 's'});
Pattern passwordPattern = Pattern.compile(
                "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[.@$!%*?amp;])[A-Za-z\d@$!%*?amp;.]{8,}$",
                Pattern.CASE_INSENSITIVE);
Matcher matcher = passwordPattern.matcher(cb);
  

Комментарии:

1. Вместо копирования char[] массива в новый CharBuffer , вы можете просто использовать CharBuffer.wap(array) для получения представления массива. Особенно с конфиденциальной информацией, вам следует избегать создания дополнительных копий.

Ответ №2:

если я заменю тип пароля на StringBuffer или char[]?

Если вы замените тип пароля на StringBuffer :

Используйте как есть, т.Е. Следующее будет успешно скомпилировано и работать по назначению:

 private boolean respectPattern(StringBuffer password) {
    Pattern passwordPattern = Pattern.compile(
            "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[.@$!%*?amp;])[A-Za-z\d@$!%*?amp;.]{8,}$",
            Pattern.CASE_INSENSITIVE);
    Matcher matcher = passwordPattern.matcher(password);
    return matcher.find();
}
  

Если вы замените тип пароля на char[] :

Использовать passwordPattern.matcher(String.valueOf(password));

Комментарии:

1. Я не хочу, чтобы мой пароль преобразовывался в строковый тип, поэтому я не хочу его использовать. Метод toString ни String.valueOf

2. Вы также можете сделать "" password , когда password является StringBuffer благодаря автоматической блокировке Java, но, честно говоря, я бы выбрал решение @arvind-kumar-avinash, поскольку оно более чистое. Могу я спросить, почему вы не хотите использовать .toString() или valueOf() ?

3. Я не хочу, чтобы мой пароль хранился в пуле констант String, потому что String неизменяемы

4. Нет необходимости вызывать toString() or String.valueOf(…) . Вы можете просто передать StringBuffer экземпляр matcher(…) напрямую.

5. строки @Ob-la-di не сохраняются в постоянном пуле, если они действительно не являются константами времени компиляции (или были добавлены явно).