如何将 Pattern 和 Matcher 与 StringBuffer 或 char[] 类型而不是 String 一起使用?

How can I use Pattern and Matcher with StringBuffer or char[] types instead of String?

如何使用这样的方法

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

如果我将 password 类型替换为 StringBufferchar[]?

if I replace password type with StringBuffer or char[]?

如果将密码类型替换为StringBuffer

按原样使用,即以下将成功编译并按预期工作:

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

如果您将密码类型替换为 char[]

使用passwordPattern.matcher(String.valueOf(password));

class java util.regex.Pattern 中的方法 matcher() 接受一个类型为 CharSequence 的参数,它是一个接口。根据 javadoc,有几个实现 classes,包括 StringBuffer。如果 none 的现有实现适合您的需要,您可以随时编写自己的实现。

例如,使用 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)(?=.*[.@$!%*?&])[A-Za-z\d@$!%*?&.]{8,}$",
                Pattern.CASE_INSENSITIVE);
Matcher matcher = passwordPattern.matcher(cb);