`

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

阅读更多
原帖地址
http://www.blogjava.net/ycyk168/archive/2009/10/25/299659.html
引用

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

相关推荐

    正则表达式学习笔记

    ### 正则表达式学习笔记 #### 一、正则表达式概述 正则表达式是一种强有力的模式匹配工具,广泛应用于各种编程语言中,用于文本处理。正则表达式允许用户定义复杂的查找模式,这对于数据验证、搜索和替换操作特别...

    [小小明]Python正则表达式全套笔记v0.3(1.8万字干货)

    本文档是小小明个人笔记,涵盖了正则表达式的各个方面,包括各种模式、分组、断言、匹配、查找、替换和切割等。文档中提供了详细的正则匹配规则表,涵盖了基本字符规则、预定义字符集、常用字符集、数量词、边界匹配...

    正则表达式学习笔记正则表达式学习笔记

    ### 正则表达式学习笔记 #### 一、正则表达式概述 正则表达式是一种强大的文本处理工具,能够帮助我们完成各种复杂的字符串匹配、提取、替换等操作。正则表达式通过定义一系列规则来匹配字符串中的模式,广泛应用...

    关于js正则表达式学习笔记(自己整理的)

    5. **分组与捕获**: `(pattern)` 用于创建一个捕获组,可以捕获匹配的部分。`$1`, `$2`等引用先前匹配的子串。 6. **选择与交替**: `pattern1|pattern2` 表示 pattern1 或 pattern2 任一能匹配。 7. **否定...

    正则表达式基础学习笔记

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。它通过一种简洁而强大的语法来定义一系列字符或字符组合,帮助程序员快速准确地定位和...

    超经典正则表达式测试工具

    4. **学习正则的学习笔记**:可能包含一份详细的正则表达式学习资料,涵盖了基础概念如元字符、量词、字符类等,以及高级特性如分组、后向引用、预查等,方便用户系统学习。 5. **正则表达式参考手册**:可能提供了...

    (正则表达式)学习笔记

    在这个“正则表达式”学习笔记中,我们将深入探讨这一强大的工具。 1. **基础概念** - **字符集**:包括普通字符(如 `a`、`b`)和特殊字符(如 `.`、`\d`),它们组合起来形成匹配模式。 - **量词**:如 `*` ...

    正则表达式系统教程.RAR

    文件可能包含了多种匹配和不匹配的情况,帮助你理解正则表达式的灵活性和多样性。 《新建 文本文档.txt》可能是一份额外的笔记或者练习材料,它可能包含了练习题或者你在学习过程中的问题和解答,是你巩固所学知识...

    精通正则表达式(英文版+中文目录)

    《精通正则表达式》是一本深入探讨正则表达式的权威书籍,英文版结合中文目录,为学习者提供了便利。正则表达式是计算机科学中用于模式匹配和文本操作的强大工具,广泛应用于文本处理、数据提取、编程语言、网页爬虫...

    正则表达式学习笔记电子文档

    1. **QQ号验证**:如果一个QQ号的长度在5到12位之间,则可以使用正则表达式 `^\d{5,12}$` 来验证。其中 `{5,12}` 表示数字必须在5到12位之间。 2. **特殊字符转义**:在正则表达式中,有些符号具有特殊含义,如 `.`...

    学习正则表达式的笔记

    在学习正则表达式时,首先要了解一些基本符号及其含义: - **通配符** - `.`:匹配除换行符之外的任意单个字符。 - `*`:匹配前面的子表达式零次或多次。 - `+`:匹配前面的子表达式一次或多次。 - `?`:匹配...

    正则表达式.7z

    本压缩包"正则表达式.7z"包含了一份"笔记.txt",这份笔记详细介绍了正则表达式的概念和使用技巧,对于后续学习正则表达式或解决相关问题有着极高的参考价值。 首先,我们需要了解正则表达式的基石——元字符。元...

    正则表达式学习的笔记

    特殊字符,即元字符,是正则表达式的核心组成部分,掌握它们的用法对于理解和使用正则表达式至关重要。 1. **定位符** - `$`:匹配字符串的末尾。 - `^`:匹配字符串的开头。在字符集合`[]`中时,表示不匹配该...

    正则表达式例子及笔记

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据验证、搜索和替换等场景。以下是对标题“正则表达式例子及笔记”和描述中的知识点进行的详细解释。 一、正则...

    正则表达式.docx

    正则表达式基础知识点总结 正则表达式(Regular Expressions)是一种专门用来处理字符串的模式匹配技术。它可以用来字符串匹配、字符串查找、字符串替换等。 正则表达式语法 1. 普通字符:字母、数字、汉字、...

    java笔记之正则表达式

    例如,检查QQ号码的合法性,我们可以用正则表达式来确保长度在5到15之间,且不以0开头,只包含数字。虽然可以直接用`String`类的方法实现,但使用正则表达式会使代码更简洁,如下所示: ```java public static void...

Global site tag (gtag.js) - Google Analytics