黑马程序员技术交流社区

标题: 正则表达式的replaceAll方法 [打印本页]

作者: 袁培育    时间: 2012-5-31 23:50
标题: 正则表达式的replaceAll方法
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})了呀?那为什么还会替换?
作者: 张亭    时间: 2012-5-31 23:55
*号的意思是0个或多个,
0*(\\d{3})
意思是以若干个0开头(0个或多个),后面跟着3个数字
002满足这样的条件,002是以0个0开头,后面跟着002三个数字
作者: 袁培育    时间: 2012-5-31 23:59
张亭 发表于 2012-5-31 23:55
*号的意思是0个或多个,
0*(\\d{3})
意思是以若干个0开头(0个或多个),后面跟着3个数字

那为什么002是以0个0开头,而00192就是以2个0开头的呢?
作者: 张亭    时间: 2012-6-1 00:06
本帖最后由 张亭 于 2012-6-1 00:16 编辑
袁培育 发表于 2012-5-31 23:59
那为什么002是以0个0开头,而00192就是以2个0开头的呢?


前面的0的个数是不确定的,但后面跟着的数字个数是确定的三个,
就是说前面有一串0或没有0后面跟3个数字
只要满足这样的条件即可,并不是说002也可以看作是2个0开头
后面跟一个数字从而不满足条件的

作者: 罗文杰    时间: 2012-6-1 00:07
因为正则表达式定义的是一个规则,你只要这个字符串以任何形式满足你的正则关系就可以。
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的情况   
作者: 乔玉吉    时间: 2012-6-1 01:23
String regx="0*(\\d{3})";这个不需要用组()的概念
改成这样String regx="0*\\d{3}";
*的意思是0次或多次 就一个区间 0--n次 之间

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

这个正则你可以从后面往前看,只要满足\\d{3}的就可以,\\d{3}才是必要条件 如果*改成 + 就得从前往后看了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2