12345678901234567890
如上是一个银行帐户号,其位数不确定,但一定长于8位,小于20位;全部是数字;
我的目标是用一个(只用一个replaceAll)正则表达式替换后,使得只保留首尾的4位数字,其他数字全用*号覆盖,如上的结果应是:
1234************7890

解决方案 »

  1.   

    不太可能吧,raplaceAll的作用是把符合模式的串用一个定义的串来替换你的要求中的模式是动态的,怎么替换,看楼下高手的吧
      

  2.   

    String str="123488888888567890";
            StringBuffer sb=new StringBuffer();
            sb.append("$1");
            for(int i=0;i<str.length()-8;i++) {
               sb.append('*');
            }
            sb.append("$2");
            System.out.println(str.replaceAll("^([\\d]{4})[\\d]{0,12}([\\d]{4})$",sb.toString()));
      

  3.   

    jFresH_MaN(Contributing to Eclipse)
    首先,感谢你的帮助,我漏了一点,这是我在程序中对众多各类数据的格式化操作,或者说过滤吧,每种类型在配置文件中用一个正则表达式,而且只能用一个!
      

  4.   

    我不是说代码量多,而是你使用了str.length()-8来生成正则式这个值不唯一,这样就会是多个正则式,我需要把这个正则式放在配置文件中,但我系统的框架只能支持我使用一个正则表达式去验证一类字符串!
      

  5.   

    测试通过,一句话完成:
    String str = "1234567890";
    System.out.println(str.replaceAll("^(\\d{4})(.*)(\\d{4})$","$1"+(str.substring(0,str.length()-8).replaceAll(".*","*"))+"$3"));
      

  6.   

    (?<=\d{4})\d(?=\d{4})
    System.out.println("123456123456123457890".replaceAll("(?<=\\d{4})\\d(?=\\d{4})", "*"));
      

  7.   

    sswater(水与争锋) 
    非常感谢,你写的正是我想要的,但我有一点不明白,左边的那个正向预查,多了一个“<”,这个该如何理解,还烦劳解释一下!
      

  8.   

    \d(?=xxxxx)  正向匹配xxxxx才捕获 \d
    (?<=xxxxx)\d 反向..................
    \d(?!xxxxx)  正向不可以是xxxxx才捕获 \d
    (?<!xxxxx)\d 反向......................
      

  9.   

    那个<号是否表示预后不保留预查到的字符直接略过到其后开始查找?
    是否还有换成>号的用法?
      

  10.   

    zoeg(沉香) 兄:\d(?=xxxxx)  正向匹配xxxxx才捕获 \d
    (?<=xxxxx)\d 反向..................
    \d(?!xxxxx)  正向不可以是xxxxx才捕获 \d
    (?<!xxxxx)\d 反向......................这四个都表示“预查后不保留预查到的字符”,“<”的意思是“向左边”预查,否则是向“右”。