A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁培育 中级黑马   /  2012-5-31 23:50  /  2389 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo
{
        public static void main(String[] args)
        {
                String str="002";
                String regx="0*(\\d{3})";
                System.out.println(str.replaceAll(regx,"#"));
        }
}
这个代码的结果是“#”,可是怎么会是“#”呢?他想判断开头是否有0,很明显开头是0,而且是两个,那这时指针不是到了2吗?那就不符合连续三个数字(\\d{3})了呀?那为什么还会替换?

5 个回复

倒序浏览
*号的意思是0个或多个,
0*(\\d{3})
意思是以若干个0开头(0个或多个),后面跟着3个数字
002满足这样的条件,002是以0个0开头,后面跟着002三个数字
回复 使用道具 举报
张亭 发表于 2012-5-31 23:55
*号的意思是0个或多个,
0*(\\d{3})
意思是以若干个0开头(0个或多个),后面跟着3个数字

那为什么002是以0个0开头,而00192就是以2个0开头的呢?
回复 使用道具 举报
本帖最后由 张亭 于 2012-6-1 00:16 编辑
袁培育 发表于 2012-5-31 23:59
那为什么002是以0个0开头,而00192就是以2个0开头的呢?


前面的0的个数是不确定的,但后面跟着的数字个数是确定的三个,
就是说前面有一串0或没有0后面跟3个数字
只要满足这样的条件即可,并不是说002也可以看作是2个0开头
后面跟一个数字从而不满足条件的
回复 使用道具 举报
因为正则表达式定义的是一个规则,你只要这个字符串以任何形式满足你的正则关系就可以。
String regx="0*(\\d{3})";
你的正则关系是  0个或多个 数字0开头,然后3个0到9的数字。
当你的字符串是002的时候 就满足了 0个0  3个0到9的数字这个情况 正好满足你的规则
当你的字符串是00192的时候   就满足两个0     3个0到9的数字这个情况  也满足你的规则

002如果不想替换的话  可以用把正则改为 0+\\d{3}   这个正则表示1个或者多个0  后面3个0到9的数字   就不满足002的情况   
回复 使用道具 举报
String regx="0*(\\d{3})";这个不需要用组()的概念
改成这样String regx="0*\\d{3}";
*的意思是0次或多次 就一个区间 0--n次 之间

\\d{3}意思是必须是3个数,首先"002"满足3个数,这个满足了前面不用看了,因为0出现的次数可以没有

这个正则你可以从后面往前看,只要满足\\d{3}的就可以,\\d{3}才是必要条件 如果*改成 + 就得从前往后看了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马