V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Zeahoo
V2EX  ›  Java

如何使用 String 类的 replaceAll 方法来使得「张三」替换为「**三」?

  •  
  •   Zeahoo · Jul 28, 2016 · 4373 views
    This topic created in 3568 days ago, the information mentioned may be changed or developed.

    下面的方法能够解决问题

      /*
       * 若真实姓名为 张三
       * 则返回 **三
       */
      public static String realName(String realName){
        if(realName == null) return null;
        char[] charArray = realName.toCharArray();
        return "**" + charArray[charArray.length - 1];
      }
    

    实现方式能不能用 replaceAll 的办法?

      public static String realName(String realName){
        if(realName == null) return null;
        return realName.replaceAll("(\\w+)(\\w)", "**$2");
      }
    

    正则中 w 不支持中文。

    24 replies    2016-07-30 18:30:49 +08:00
    v1024
        1
    v1024  
       Jul 28, 2016 via iPhone
    JS :
    "**" + "胡汉三".split("").pop()
    Zeahoo
        2
    Zeahoo  
    OP
       Jul 28, 2016
    @v1024 不应该交给前端来做这件事吧,应该要后端来把名称给隐藏后再返回给前端,这样应该会好些。
    BuilderQiu
        3
    BuilderQiu  
       Jul 28, 2016   ❤️ 3
    正则换成: ^.*(.)$
    Zeahoo
        4
    Zeahoo  
    OP
       Jul 28, 2016
    @BuilderQiu 成功了~感谢!
    caixiexin
        5
    caixiexin  
       Jul 28, 2016
    public static void main(String[] args) {
    String name = "张三";
    String name2 = name.replaceAll("([\\u4e00-\\u9fa5])([\\u4e00-\\u9fa5])","**$2");
    System.out.println(name2);
    }
    v1024
        6
    v1024  
       Jul 28, 2016
    @Zeahoo Node.js  啊。我就凑个热闹,没看见是java节点。
    Bryan0Z
        7
    Bryan0Z  
       Jul 28, 2016 via Android
    为啥你写的这么烦
    "**"+string.charAt(string.length());
    一行不就好了
    xcodebuild
        8
    xcodebuild  
       Jul 28, 2016
    让前端隐藏是掩耳盗铃。。
    icaca
        9
    icaca  
       Jul 28, 2016
    select 的时候直接处理好
    hoperuin
        10
    hoperuin  
       Jul 28, 2016   ❤️ 1
    想不明白了,为什么要这么复杂呢?看下面 demo
    public class Test {
    public static void main(String[] args) {
    String s = "哈哈张三我哈哈哈张三哦";
    System.out.println(s.replaceAll("张三","**三"));
    }
    }

    输出:
    哈哈**三我哈哈哈**三哦
    Bryan0Z
        11
    Bryan0Z  
       Jul 28, 2016 via Android
    @hoperuin 因为他是任意两个字的中文名?
    dullwit
        12
    dullwit  
       Jul 28, 2016   ❤️ 3
    看到 string 判断用 == null ,我心情就紧张起来了
    21grams
        13
    21grams  
       Jul 28, 2016 via Android
    @hoperuin 我也是这么想的,不是很简单吗
    Sunshow
        14
    Sunshow  
       Jul 28, 2016
    别浪,踏踏实实用 StringUtils
    Cabana
        15
    Cabana  
       Jul 28, 2016 via Android
    ==null …你会吃亏的
    Zeahoo
        16
    Zeahoo  
    OP
       Jul 28, 2016
    @Cabana 刚实习……不懂,说一下原因。。。好怕啊你们说的
    Zeahoo
        17
    Zeahoo  
    OP
       Jul 28, 2016
    @dullwit 求教一下,说得我好怕
    Zeahoo
        18
    Zeahoo  
    OP
       Jul 28, 2016
    @Bryan0Z 因为要把它写在工具类里面,其他都是正则写的, &_& 小强迫症
    bp0
        19
    bp0  
       Jul 29, 2016
    考虑复姓的情况了吗? 欧阳三,应该换成“**三”,而不是“**阳三”吧?
    thinkmore
        20
    thinkmore  
       Jul 29, 2016
    占坑问问题!!

    同问一个问题,我现在前台输入字符串,然后解析规则是:将逗号转义为\c ,然后将\转义成为\\,然后存入数据库。

    此时如果我从数据库取出的数据是\\c ,如何将其转义为\,

    如果前台输入的是\c 这种怎么办?

    请问 java 或者 js 有什么好的方法吗?
    Zeahoo
        21
    Zeahoo  
    OP
       Jul 29, 2016
    @bp0 不管姓名有多长,只需要显示最后一个字就行了,考虑到了~
    chocotan
        22
    chocotan  
       Jul 29, 2016
    [charArray.length - 1]
    当传入的是""字符串的时候会抛异常
    Bryan0Z
        23
    Bryan0Z  
       Jul 29, 2016 via Android
    @dullwit
    @Cabana
    求问,正确方法是什么,以及为什么不能用==null
    haniklz
        24
    haniklz  
       Jul 30, 2016 via Android
    难道不是替换人名中的姓?用正则表达式性能多低啊 直接 length 大于 1 时 返回 **+substring(1)不好么。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2803 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 14:52 · PVG 22:52 · LAX 07:52 · JFK 10:52
    ♥ Do have faith in what you're doing.