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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张小龙 中级黑马   /  2012-10-8 21:48  /  1995 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张小龙 于 2012-10-9 11:02 编辑

java基础视频里正则表达式有一段程序,这里简写如下:
String str="192.68.1.254";
str=str.replaceAll("(
\\d+)","00$1");
此时str应该是"00192.0068.001.00254"

再继续下面的语句:
str=str.replaceAll("0*(\\d{3})","$1")
上面这句之后结果就成了"192.068.001.254",这里有点疑惑,首先0*匹配的话,应该直接匹配完两个0然后再匹配(\\d{3})  那么两位的数字68应该是不匹配的,但是还是被匹配了,这里我只能认为是0*是默认的先匹配0个0,然后判断后面匹配否,如果匹配,则替换;如果不匹配,再试试匹配1个0,2个0,直到匹配完所有0。

这样虽然能解释的通,但是下面又有一句
str=str.replaceAll("0*(\\d+)","$1");
这句之后的结果是"192.68.1.254"
也就是说 0应该是把所有的0匹配完之后,才进行后面\\d+)的匹配的 那上面第二句 0*(\\d{3})  应该就是先匹配完所有的0 再找后面还有3个数字的,那么  0068怎么可能变成068呢,不是说好的匹配完所有的0吗?
被上面的例子弄纠结了,求论坛的大神解释解释,谢谢

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 唐增友 于 2012-10-8 23:05 编辑

X*        X,零次多次
X+              X,一次多次

str=str.replaceAll("0*(\\d{3})","$1")
保留后面3个数字(包括0),前面的 任意个0将去掉

str=str.replaceAll("0*(\\d+)","$1");
保留后面1个或多个数字,前面的 任意个0将去掉

$1 表示第一个括号中表达式 的匹配值

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
唐增友 发表于 2012-10-8 22:55
X*        X,零次或多次
X+              X,一次或多次

你说的我明白,但是我想知道,0*是匹配0或者任意个,那0*匹配0068的时候,可以匹配2个,然后在匹配后面的68两个数字,也可以一个都不匹配,然后匹配后面006三个数字,为什么就偏要匹配1个0 然后匹配后面的068呢
回复 使用道具 举报
本帖最后由 张飞年 于 2012-10-9 01:40 编辑

我想应该是这样理解吧:首先0*是大于等于零个0;(.)被表示的序号为1,$1就代表()内的内容;\d+是表示一个或者多个数字;
str = "00192.0068.001.00254";
str=str.replaceAll("0*(\\d{3})","$1");//这句的意思应该是将符合 0*(\\d{3})  的字符串替换为 $1 ,这里的 0*(\\d{3}) 表示的是一个前面任意多个0,后面紧跟一组由3个数字的字符串(这3个字符串被 成组为1号组),$1表示当前正则中第一组括号中的内容,所以在这里会将类似000000192等替换为最后3个字符组成的字符串,有带点强制的意味,大点说就是把一个大串替换成了单独成组的那一串。
str=str.replaceAll("0*(\\d+)","$1");//这儿与上面唯一不同的就是把{3}换成了+,我想这 0*(\\d+) 的意思是前面任意多个单个0组成的字符串,再跟一组 由任意多个数字组成的一组字符串(\d里包括0),替换时将前字符串替换为组中的字符串,如果恰好组中最前面是0,那么组中的0就跟随了0*,所以最后的结果是替换成了 去零开头的组中字符串。
==========================================
说的有点像绕口令,哈哈
回复 使用道具 举报
张小龙 发表于 2012-10-9 00:21
你说的我明白,但是我想知道,0*是匹配0或者任意个,那0*匹配0068的时候,可以匹配2个,然后在匹配后面的 ...

因为 你心里已经默认是从左往右匹配了,所以陷入死胡同
事实上却是先匹配的括号里的 组,将组匹配完了 才匹配别的。
毕竟代码是不可能提前预判 到底该匹配几个字符的,只能在其他优先级高的匹配完后 剩下几个就匹配几个。
回复 使用道具 举报
尤洋 发表于 2012-10-9 09:42
因为 你心里已经默认是从左往右匹配了,所以陷入死胡同
事实上却是先匹配的括号里的 组,将组匹配完了 才 ...

如果真是先匹配括号里的话,那么上面的问题确实能够解释的通了。多谢指点
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马