这个正则表达式该怎么写?

zoeg 2005-10-14 10:29:08
12345678901234567890
如上是一个银行帐户号,其位数不确定,但一定长于8位,小于20位;全部是数字;
我的目标是用一个(只用一个replaceAll)正则表达式替换后,使得只保留首尾的4位数字,其他数字全用*号覆盖,如上的结果应是:
1234************7890
...全文
248 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoeg 2005-10-17
  • 打赏
  • 举报
回复
了解
低调的小青蛙 2005-10-17
  • 打赏
  • 举报
回复
zoeg(沉香) 兄:

\d(?=xxxxx) 正向匹配xxxxx才捕获 \d
(?<=xxxxx)\d 反向..................


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

这四个都表示“预查后不保留预查到的字符”,“<”的意思是“向左边”预查,否则是向“右”。
Mark_Chen 2005-10-17
  • 打赏
  • 举报
回复
zoeg 2005-10-17
  • 打赏
  • 举报
回复
那个<号是否表示预后不保留预查到的字符直接略过到其后开始查找?
是否还有换成>号的用法?
低调的小青蛙 2005-10-17
  • 打赏
  • 举报
回复
\d(?=xxxxx) 正向匹配xxxxx才捕获 \d
(?<=xxxxx)\d 反向..................


\d(?!xxxxx) 正向不可以是xxxxx才捕获 \d
(?<!xxxxx)\d 反向......................
godhammer 2005-10-17
  • 打赏
  • 举报
回复
高手阿
正则表达式还是很有研究价值的
zoeg 2005-10-17
  • 打赏
  • 举报
回复
另外,正向预查是否还有其他的形式?能否说说!
zoeg 2005-10-17
  • 打赏
  • 举报
回复
sswater(水与争锋)
非常感谢,你写的正是我想要的,但我有一点不明白,左边的那个正向预查,多了一个“<”,这个该如何理解,还烦劳解释一下!
低调的小青蛙 2005-10-17
  • 打赏
  • 举报
回复
(?<=\d{4})\d(?=\d{4})


System.out.println("123456123456123457890".replaceAll("(?<=\\d{4})\\d(?=\\d{4})", "*"));
shkirin 2005-10-17
  • 打赏
  • 举报
回复
楼上的应该没什么问题
laughsmile 2005-10-17
  • 打赏
  • 举报
回复
测试通过,一句话完成:
String str = "1234567890";
System.out.println(str.replaceAll("^(\\d{4})(.*)(\\d{4})$","$1"+(str.substring(0,str.length()-8).replaceAll(".*","*"))+"$3"));
zoeg 2005-10-17
  • 打赏
  • 举报
回复
哪位大哥帮忙顶一顶啊
zoeg 2005-10-14
  • 打赏
  • 举报
回复
我不是说代码量多,而是你使用了str.length()-8来生成正则式这个值不唯一,这样就会是多个正则式,我需要把这个正则式放在配置文件中,但我系统的框架只能支持我使用一个正则表达式去验证一类字符串!
jFresH_MaN 2005-10-14
  • 打赏
  • 举报
回复
正则表达式本来就是一个
上面的代码只所以那么多句,是因为替换的那个字符川需要动态的得到。
zoeg 2005-10-14
  • 打赏
  • 举报
回复
jFresH_MaN(Contributing to Eclipse)
首先,感谢你的帮助,我漏了一点,这是我在程序中对众多各类数据的格式化操作,或者说过滤吧,每种类型在配置文件中用一个正则表达式,而且只能用一个!
superslash 2005-10-14
  • 打赏
  • 举报
回复
lyszjs 2005-10-14
  • 打赏
  • 举报
回复
楼上的思路是正确的,但偶也是新手,最后一句不怎么看的懂。哈哈。
majy 2005-10-14
  • 打赏
  • 举报
回复
吐血,这还是一句话吗?
jFresH_MaN 2005-10-14
  • 打赏
  • 举报
回复
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()));
majy 2005-10-14
  • 打赏
  • 举报
回复
不太可能吧,raplaceAll的作用是把符合模式的串用一个定义的串来替换

你的要求中的模式是动态的,怎么替换,看楼下高手的吧

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧