`
isiqi
  • 浏览: 16502189 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java 正则 块转义,忽略大小写,匹配换行模式,匹配先前匹配的文本(解释正则运行机制)

 
阅读更多

@author YHC

            //块转义:\Q \E \Q会抑制所有的元字符的含义  
	    //,如果漏写了\E,那么从\Q开始之后的所有字符都将当作字面文本对待  
	    System.out.println("*'".matches("\\Q*'\\E"));//true  
	    //全部忽略大小写   
	    System.out.println("ABc".matches("(?i)abc"));//true  
	    //仅此a忽略大小写,(?i)会在正则表达式剩余打开  
	    //,不区分大小写,(?-i)会关闭剩余部分的匹配,他们就像一对开关  
	    System.out.println("ABc".matches("(?i)a(?-i)bc"));//false  
	       //.代表任意字符,如果字符串中有\r\n,将不能匹配,所以我们需要开启  
	    //匹配换行模式 对比  
	    System.out.println("5455433535\r\n523543".matches(".*"));//false  
	    //开启换行匹配,javascript不支持  
	    System.out.println("5455433535\r\n523543".matches("(?s).*"));//true  
	    //再次匹配先前匹配的文本,下面的08出现了三次,那么我们如何匹配这样的文本  
	    //例如一个正则表达式也可以完成这样的功能2009-09-09 同样匹配  
	    //为了在一个正则表达式中匹配先前匹配到的文本,我们首先必须捕获上次  
	    //匹配的文本,这可以使用捕获分组实现,我们可以使用反向引用,在该正则  
	    //表达式的任何地方匹配相同文本,你可以使用反斜杠后根一个单个数字(1-9)  
	    //来引用前九个分组,,而第10-99组需要用\10~-99  
	    //注意:不能使用 \01 因为在java中这个是一个8进制的转义字符  
	    System.out.println("2008-08-08".matches("\\d\\d(\\d\\d)-\\1-\\1"));//true  
	    System.out.println("2009-09-09".matches("\\d\\d(\\d\\d)-\\1-\\1"));//true 
	    
	    //对以上的解释运行机制
	    //当正则表达式\\d\\d(\\d\\d)-\\1-\\1遇到2008-08-08的时候
	    //第一个\\d\\d会匹配20接着根据目标文本中达到的位置,正则引擎会引进
	    //分组,在捕获分组中的(\\d\\d)会匹配08,然后引擎会到达分组的右括号
	    //在这个点上,部分匹配08会保存到1号捕获分组中,下一个几号是连字符,它
	    //会按照字面进行匹配,接着就遇到反像引用,正则引擎会检查第一个捕获分组
	    //的内容:08,然后引擎会试着按照字面来匹配这个文本,如果该正则表达式
	    //是不区分大小写的,那么捕获分组也会按照这种方式进行匹配,在这里如果
	    //反向引用会匹配成功.下一个连字符和反向引用也会匹配成功这样就找到了
	    //一整个匹配:2008-08-08
	    
	    //注意:捕获分组的重复匹配
	    //一个对改组的反向引用只会匹配该分组的最后一次捕获到的文本;
	    //example 重复匹配
	    //如果同一个正则表达式遇到2008-05-28 2002-02-02,当\\d\\d(\\d\\d)
	    //匹配到2008的时候,该分组第一次捕获到的内容:08,会被保存到一个
	    //(也是唯一一个)捕获分组中,接下来,连字符:-也会匹配它自身,
	    //反向引用在试图用05匹配08的时候,匹配会失败.
	    //由于该正则表达式中不存在其他的分支,引擎也会放弃匹配尝试,
	    //从目标文本中的第一个0开始\\1不再存有任何文本内容,也就是
	    //反向引用\\1,没有内容了
	    //接下来继续处理2008-05-28 2002-02-02,该分组下一次会,
	    //捕获到的内容是当\\d\\d(\\d\\d)匹配到2002的时候,它会
	    //将02保存起来,接下来连字符匹配自身,现在反向引用试图匹配02,
	    //这次匹配是成功的,接着下一个连字符,反向引用,都会匹配成功,
	    //结果是找到了2002-02-02
	    
	    //注意:正则引擎的顺序
	    //因为正则是从前向后处理的,因此应当把捕获括号放到反向引用的前面,
	    //正则表达式\\d\\d\\1-(\\d\\d)-\\1,\\d\\d\\1-\\1-(\\d\\d)
	    //永远不可能匹配到任何东西,因为这里的反向引用是在捕获分组之前的
	    //因此它没有捕获到任何东西.


分享到:
评论

相关推荐

    正则表达式学习工具很方便,我是从这个学习的!

    7. **模式修饰符**:在正则表达式的末尾添加模式修饰符可以改变匹配行为,如`i`使匹配不区分大小写,`g`全局匹配,`m`多行模式等。 在学习正则表达式时,通常会使用一些工具来帮助理解和测试正则表达式,比如...

    Java开发技术大全(500个源代码).

    constCharExample.java 演示转义字符 converseNumber.java 逆向输出数字 daffodilNumber.java 求水仙花数 division.java 演示整除结果 errorCompoundVariable.java 错误使用局部变量示例 factorial.java 求...

    正则表达式链接替换函数的技巧

    例如,i修饰符表示不区分大小写,g修饰符表示全局匹配整个字符串,而不是匹配第一个就停止。 5. **链接结构分析**:链接通常由两部分组成,即超链接文本(即用户点击的部分)和超链接URL(即链接指向的目标地址)。...

    Shell十三问.Doc

    变量名区分大小写,例如`$a`和`$A`是不同的变量。赋值时,数字不需要引号,字符串需要双引号或单引号包围。Perl支持多种进制的数字表示,如八进制(以0开头)、十六进制(以0x或0X开头)以及浮点数。在字符串中,反...

    shell高级编程经典教程

    其基本命令格式为`sed 's/old_pattern/new_pattern/flags' filename`,其中`flags`可以是`g`(全局替换)、`i`(忽略大小写)等。`sed`命令支持插入、删除、替换等操作,但默认不会修改原文件,而是将结果输出到标准...

    JAVA面试题最全集,JAVA面试题最全集

    而`String`不是基本数据类型,它是Java中的一个类,用来表示文本字符串。 - **基本数据类型**:存储在栈中,内存分配给每个变量。例如,`int`类型的变量占用4个字节。 - **String**:对象存储在堆中,可以通过字符...

    AddEscape:将文本文件编码为“printf”样式的 Java 程序

    6. **异常处理**:Java的异常处理机制,如`try-catch-finally`块,确保在读写文件或处理JSON时遇到错误能够优雅地处理。 7. **命令行参数**:程序可能接受命令行参数,如文件路径,使用`java.util.ArrayList`和`...

    很好的Shell总结教程

    - **7.2.12 忽略大小写匹配(I)**:使模式匹配时不区分大小写。 - **7.2.13 获取总行数(#)**:显示当前行号。 #### 8.3 awk `awk`是一种用于文本处理的强大工具,它可以执行复杂的文本分析和报告生成。 - **...

    jtr-开源

    3. **支持的标准修饰符**:在Perl 5中,音译操作可以配合多种修饰符,如`c`清除已替换的字符,`d`删除未匹配的字符,`g`全局替换,`i`不区分大小写等。此Java库很可能也提供了这些修饰符的功能,以满足各种字符串...

    JavaScript王者归来part.1 总数2

     5.7.1 运行时类型识别--两个运行的类型识别的例子   5.7.2 类型的自动转换及其例子   5.7.3 强制类型转换及其例子   5.7.4 高级用法--一个自定义类型转换的例子   5.8 警惕数值陷阱   5.8.1 困惑--...

    php_笔试大全_面试题_答案_解析.doc

    8. 比较两个字符串大小:`strcasecmp()`函数在不区分大小写的情况下比较字符串,`strcmp()`在区分大小写的情况下比较。`srpos`用于查找子串在原字符串中的位置,`==`用于比较两个变量是否相等。 9. 正则表达式匹配...

    java面试大全

    ### Java面试大全知识点详解 #### 一、Java基础知识 1. **Java基本数据类型** Java中有八种基本数据类型:byte、short、int、long、float、double、char 和 boolean。`String`不是基本数据类型,而是一个类。...

    java代码-账号注册与登录

    10. **安全性最佳实践**:防止SQL注入、XSS攻击等是Web开发中的重要考虑,这需要在编写SQL语句时避免使用用户输入的值直接拼接,以及对输出内容进行适当的转义。 `README.txt` 文件可能包含了关于如何编译和运行这...

    2018 PHP 最新面试题

    - **垂直分表**:将一张大表分成多张小表,每张表包含一部分字段,适用于字段较多且使用频率不同的情况。 - **水平分表**:将一张大表的数据按规则分散到多张结构相同的表中,适用于数据量非常大的情况。 - **...

    精易模块[源码] V5.15

    15、改善“普通填表类-就绪判断_源码关键字”添加区分大小写参数。 MD5: 3C01272B9E2DAFDEF08D20C191E3C265 精易模块 V5.12 what’s new:(20150108) 1、删除“IP_取外网IP”与 网页_取外网IP()功能重复命令,...

    The GNU C Library Reference Manual

    模式匹配是文本处理中的一个重要方面,本章介绍了GNU C库中如何使用正则表达式进行字符串的匹配和替换操作。正则表达式是一种强大的文本处理工具,能够极大地简化复杂的文本处理任务。 ### 11. 输入/输出概览 **...

    javaScript验证大全

    6. 自定义函数验证:根据具体需求编写特定的验证函数,例如验证密码强度,检查是否包含大小写字母、数字和特殊字符。 三、增强的JavaScript验证技术 1. AJAX异步验证:通过发送请求到服务器进行更复杂的验证,如...

    go web编程

    - **模式匹配**:查找字符串中的特定模式。 - **替换操作**:替换符合模式的子串。 **7.4 模板处理** - **文本模板**:使用 `text/template` 包。 - **HTML 模板**:使用 `html/template` 包。 - **自定义模板函数...

Global site tag (gtag.js) - Google Analytics