如何在Java中使条件StringUtils小于特定字符

如何在Java中使条件StringUtils小于特定字符,java,regex,spring,string-utils,Java,Regex,Spring,String Utils,我写了一个字符串类,它可以屏蔽用户名之类的东西 输入-->Johny Holloway期望输出-->J***y H***y 以及它的工作原理 但是,如果用户输入的姓名少于3个字符,我喜欢更改代码 榜样;名称BR--->B***R;姓氏-->KL-->K***L 如何根据上面的示例更改我的代码 我的代码如下 public class MaskWords { public String mask(String str) { if (StringUtils.isBlank(str))

我写了一个字符串类,它可以屏蔽用户名之类的东西

输入-->Johny Holloway期望输出-->J***y H***y

以及它的工作原理

但是,如果用户输入的姓名少于3个字符,我喜欢更改代码

榜样;名称BR--->B***R;姓氏-->KL-->K***L

如何根据上面的示例更改我的代码

我的代码如下

public class MaskWords {

  public String mask(String str) {

    if (StringUtils.isBlank(str)) {
      return str;
    }

    String out = "";
    for (String d : str.split("\\s+")) {
      String startChar = d.substring(0, 1);
      String endChar = d.substring(d.length() - 1, d.length());
      out = out + startChar + "***" + endChar + " ";
    }
    return out.trim();
  }

  public List<String> mask(List<String> str) {
    List<String> maskedStringList = new ArrayList<>();
    for (String stringToMask : str) {
      maskedStringList.add(mask(stringToMask));
    }
    return maskedStringList;
  }  
公共类MaskWords{
公共字符串掩码(字符串str){
if(StringUtils.isBlank(str)){
返回str;
}
串出“”;
用于(字符串d:str.split(\\s+)){
String startChar=d.substring(0,1);
字符串endChar=d.substring(d.length()-1,d.length());
out=out+startChar+“***”+endChar+”;
}
return out.trim();
}
公共列表掩码(列表str){
List maskedStringList=新的ArrayList();
for(字符串stringToMask:str){
添加(mask(stringToMask));
}
返回掩码字符串列表;
}  

以不同的方式处理案例,两个字符可以相同

为了使代码更好,不要使用字符(UTF-16),而是使用Unicode代码点。 有时Unicode编码点,符号,使用2个字符:中文,表情符号。所以更一般 将是:

StringBuilder out = new StringBuilder(str.length + 10);
for (String d : str.split("\\s+")) {
    int codePoints = d.codePointCount(0, d.length());
    if (codePoints >= 2) {
        int startChar = d.codePointAt(0);
        int endChar = d.codePointBefore(d.length());
        out.appendCodePoint(startChar).append("***").appendCodePoint(endChar).append(' ');
    } else if (codePoints == 1) {
        out.append(d).append("***").append(' ');
        // Or: out.append("* ");
    }
}
return out.toString().trim();
对于1个代码点,我提出了
X***
(更好的
*
),但如果需要,第一个if将涵盖
X***/code>,对于>0


StringBuilder
更快,它的
appendCodePoint
在这里很有用。

只需单独测试2个字符的长度。不要使用正则表达式,尤其是刚开始使用的正则表达式。请注意,您还没有指定如何使用单个字符名。我知道,但我需要添加一个if条件我的代码。怎么能这样做。谢谢你的回复如果你已经写了,那么首先你看起来很好,所以不要告诉我在特殊情况下你不能做if。单字符名称应该是->名称:n->n***姓氏->s***始终3个开始你确定你的代码没有运行两个字符串吗方法?请注意,我个人会将其分为两种方法:一种用于拆分名称,另一种用于屏蔽单个名称(
maskFullName
和一种私有的
maskName
方法)。您可能已经注意到,这样的逻辑会随着特殊情况而迅速爆发。谢谢您,为什么我们(str.length()+10);使用这个完全不需要的容量参数,但对于最终的10000个字符的字符串,不断增长的StringBuilder通常会重新分配到更大的内部
char[]
,因此这是一个估计值,以防止需要经常重新分配。