零全零美(www.zzgwt.com)
生活中的很多事情,并不像If...Else那么简单!
posts - 96,comments - 52,trackbacks - 0

问题提出:将格式为:"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"));

  抛砖引玉,希望对您有所帮助!
  内容原创,转载请注明出处!
posted on 2009-10-25 13:01 零全零美 阅读(3965) 评论(2)  编辑  收藏 所属分类: 正则表达式

FeedBack:
# re: [原创]正则表达式学习笔记(5):分组、捕获性分组和非捕获性分组
2009-10-26 11:39 | 凡客诚品
分享了~谢谢~  回复  更多评论
  
# re: [原创]正则表达式学习笔记(5):分组、捕获性分组和非捕获性分组
2009-10-26 16:38 | 伊莎贝儿
分组是可以结合量词使用的  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: