【问题标题】:How can I use Pattern and Matcher with StringBuffer or char[] types instead of String?如何将 Pattern 和 Matcher 与 StringBuffer 或 char[] 类型一起使用而不是 String?
【发布时间】:2021-01-26 02:25:45
【问题描述】:

我怎样才能使用这样的方法

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[]

【问题讨论】:

    标签: java string matcher stringbuffer


    【解决方案1】:

    java util.regex.Pattern 类中的方法 matcher() 采用单个参数,其类型为 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)(?=.*[.@$!%*?&])[A-Za-z\\d@$!%*?&.]{8,}$",
                    Pattern.CASE_INSENSITIVE);
    Matcher matcher = passwordPattern.matcher(cb);
    

    【讨论】:

    • 无需将char[] 数组复制到新的CharBuffer 中,您只需使用CharBuffer.wap(array) 即可获得数组的视图。尤其是对于敏感信息,您应该避免创建额外的副本。
    【解决方案2】:

    如果我用 StringBuffer 或 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));

    【讨论】:

    • 我不希望我的密码被转换成 String 类型,所以我不想使用 .toString 方法和 String.valueOf
    • 您也可以在密码是 StringBuffer 时使用 ""+password,这要归功于 Java 的自动装箱,但老实说,我会选择 @arvind-kumar-avinash 解决方案,因为它更干净。请问您为什么不想使用.toString()valueOf()
    • 我不希望我的密码存储在字符串常量池中,因为字符串是不可变的
    • 无需致电toString()String.valueOf(…)。您可以直接将StringBuffer 实例传递给matcher(…)
    • @Ob-la-di 字符串不会存储在常量池中,除非它们确实是编译时常量(或显式添加)。
    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2019-06-18
    • 2018-11-04
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多