正则表达式学习笔记(5):分组、捕获性分组和非捕获性分组

原帖地址
http://www.blogjava.net/ycyk168/archive/2009/10/25/299659.html
[quote]
问题提出:将格式为:"25/10/2009"的时间转换为"2009-10-25"的格式
问题分析:
1、年份2009、月份10、日25应该做为一个独立的单位,这样我们可以直接知道什么地方匹配的是年、月还是日
2、可以用\d\d\d\d来匹配年份,用\d\d来匹配月份,用\d\d来匹配日
3、应该可以有一个地方存储匹配过的结果,以便于转换
解决问题所必须知道的:
1、分组就是将若干单位(可以是字符,正则表达式等等)组织在一起,成为一个独立的单元,该单位可以跟独立的字符一样,受量词的控制,分组使用()表示
2、分组分为捕获性分组和非捕获性分组,简单的说捕获性分组就是捕获分组所匹配的内容暂且存储在某个地方,以便下次使用,捕获性分组以(...)表示,有些地方将取得捕获性分组所匹配结果的过程称之为"反向引用",非捕获性分组不捕获分组所匹配的内容,当然也就得不到匹配的结果,非捕获性分组以 (?:...)表示,在一些只需要分组匹配但是并不需要得到各个分组匹配的结果时,使用非捕获性分组可以提高匹配速度。
3、在JavaScript和Java中,捕获性分组所匹配的内容都是以$1,$2,$3...的格式保存的!
解决问题:
1、初步表达式:(\d\d)/(\d\d)/(\d\d\d\d),第一个分组(\d\d)表示日,第二个分组(\d\d)表示月,最后一个分组(\d\d\d\d)表示年
2、取得匹配后的结果:
在JavaScript中,分组匹配的结果是存储在RegExp中的,可以通过RegExp.$1,RegExp.$2...来取得相应的分组匹配结果
<script type="text/javascript">
<!--
window.onload = function(){
var now = "25/10/2009";
/(\d\d)\/(\d\d)\/(\d\d\d\d)/.test(now);
alert(RegExp.$1); //25
alert(RegExp.$2); //10
alert(RegExp.$3); //2009
}
//-->
</script>

在Java中,可以通过Matcher的group(int)方法来取得:
String now = "25/10/2009";
Matcher matcher = Pattern.compile("(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)").matcher(now);
if (matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
}

注意:在String的replace()方法中,也可以直接以$1,$2...的格式来取得匹配结果
3、转换:
JavaScript:
<script type="text/javascript">
<!--
window.onload = function(){
var now = "25/10/2009";
/(\d\d)\/(\d\d)\/(\d\d\d\d)/.test(now);
alert(RegExp.$3+"-"+RegExp.$2+"-"+RegExp.$1); //2009-10-25
}
//-->
</script>

Java:
String now = "25/10/2009";
Matcher matcher = Pattern.compile("(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)").matcher(now);
if (matcher.find()) {
System.out.println(matcher.group(3) + "-" + matcher.group(2) + "-" + matcher.group(1));
}

4、一个简单的写法:

JavaScript:
<script type="text/javascript">
<!--
window.onload = function(){
var now = "25/10/2009";
alert(now.replace(/(\d\d)\/(\d\d)\/(\d\d\d\d)/,"$3-$2-$1")); //2009-10-25
}
//-->
</script>

Java:
String now = "25/10/2009";
System.out.println(now.replaceAll("(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)", "$3-$2-$1"));

5、分组结果量词使用
上文提到,分组是可以结合量词使用的,所以上面的程序也可以这样来写:
JavaScript;
<script type="text/javascript">
<!--
window.onload = function(){
var now = "25/10/2009";
alert(now.replace(/(\d{2})\/(\d{2})\/(\d{4})/,"$3-$2-$1")); //2009-10-25
}
//-->
</script>

Java:

String now = "25/10/2009";
System.out.println(now.replaceAll("(\\d{2})/(\\d{2})/(\\d{4})", "$3-$2-$1"));
[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值