#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()
orString.valueOf(…)
. Вы можете просто передатьStringBuffer
экземплярmatcher(…)
напрямую.5. строки @Ob-la-di не сохраняются в постоянном пуле, если они действительно не являются константами времени компиляции (или были добавлены явно).