热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正则表达式及其范例

为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\,

为什么80%的码农都做不了架构师?>>>   hot3.png

一、前言部分

      控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\,送进内存的是\\

      java字符串中的特殊字符只有转义字符 \ 和表示边界的字符 " 

      转义字符的作用是:(1)将边界符转义成普通字符

                                 (2)将自身转义成普通字符

                                 (3)将无法用26字母表示的输入转义出来,如 \t 表示制表符 \r表示回车 \n表示换行等

     在java字符串,字符 \ 只能组成\b  \t  \n  \f  \r  \"  \' \\ 这几种形式。


使用时:

                Pattern pattern = Pattern.compile("\\d{6}");

      

      对于某些函数的正则表达式(字符串)参数,比如split的参数,写好正则表达式,然后转义其中的java字符串特殊字符 \ 和 " 即可


二、使用范例简介:

      (1)将正则表达式的字符串编译成pattern,

        Pattern pattern = Pattern.compile("^Java.*");

      (2)利用pattern的matcher方法,构造matcher对象,参数是待匹配字符串:Java不是人。

        Matcher matcher = pattern.matcher("Java不是人");

      (3)根据自己需求,调用matcher的方法


      例如:  

        boolean b= matcher.matches()   //当条件满足时,将返回true,否则返回falsematcher.replaceAll("Java") //返回的是替换后的字符串,//调用find方法递归出匹配结果        while (matcher.find()) { System.out.printf( "I found the text \"%s\" starting at index %d and ending at index %d.%n", matcher.group(), matcher.start(), matcher.end() ); }

      

        另外:Pattern对象还有个split方法,来根据 正则表达式 分割串(三种:逗号 空格 竖线)      

        Pattern pattern1 = Pattern.compile("[, |]+");String[] strs = pattern1.split("Java Hello World  Java,Hello,,World|Sun");


        上述语句中字符 | 在方括号中,表示普通字符,不用转义,当然转义也没错:[, \\|]+,但是用在括号外,则一定转义

字符 - 在方括号中如果前面或后面没有数字,不闭合,则表示普通字符:正则 [4-] 匹配 -    当然正则 [4\\-] 也匹配 -

 像^ * .等单独使用作为分割符,虽然不会报错(可以通过java的字符串检查机制),但是结果会是意想不到。因此需要加上\\


三、简单规则

    ----------------------------------------------------------------------------

      正则表达式的特殊字符(元字符 meta characters)

(1) - 连字符,在[]中用作范围时需要转义,例如[0-9]


(2) \ 转义字符                     

             \\ 反斜杠   

             \t 制表符 ('/u0009')

             \n 换行 ('/u000A')

             \r 回车 ('/u000D')

             \d 数字 等价于[0-9]     

             \D 非数字 等价于[^0-9]

             \s 空白符号 [/t/n/x0B/f/r]

             \S 非空白符号 [^/t/n/x0B/f/r]

             \w 单词字符 [a-zA-Z_0-9]

             \W 非单词字符 [^a-zA-Z_0-9]

             \b              单词边界  

                     er\b 匹配never,不能匹配version,因为er在一个词的中间 

                      \bdog\b   匹配dog 不匹配doggie

             \B              非单词边界  

                     \bdog\B   匹配doggie 不匹配dog

             \A 输入的开头

             \z 输入的结尾        

                    \G 上一个匹配的结尾

                     \Gdog  匹配dogdog两个,匹配“dog dog”一个,

                                  由于第二次出现的“dog”不是在前一个匹配结尾的开始      

(3) . 单个任意字符(除换行外)


(4) * 前面的字符出现0次以上

             J*     0个以上J

             .*     0个以上任意字符

             J.*D   J与D之间0个以上任意字符

            

(5) + 前面的字符出现1次以上

             J+     1个以上J

             .+     1个以上任意字符

             J.+D     J与D之间1个以上任意字符


(6) ^     以后面出现的字符开头   ^java 以Java为开头字符


(7) $ 以前面出现的字符结尾 java$ 以java为结尾字符


(8) []   里面出现的字符任意一个(待选字符连着写,中间无空格,如果是[, |] 则是三种分隔符:空格 逗号 竖线)

              [aeio] aeio其中任意之一

                [0-9a-z] 0 to 9或a to z范围中一个字符

                 [0-9[a-z]]    0 to 9或a to z范围中一个字符(同上),并集

                [a-z&&[^bc]] a-z除去b和c中的任意一个,&&是交集,同:[ad-z] 

                [^a-z] 不在a to z范围中的任意一个字符


(9) () 表示一个组,其中的文字表示一个单位。前面的 + | $ ^ * 都可以用这个表示组来限定范围

                 (z|f)ood zood或food 

                 do(es)   do或does

                 (10) | 前后两者取一

                 J|A     J或A

                 Java|Hello   Java或Hello

                 z|food   z或food

                 (z|f)ood zood或food 

                

  (11)  {} 限制为连续出现指定次数字符

                 J{2}     JJ

                 J{3}     JJJ

                 J{3,}     JJJ,JJJJ,JJJJJ,???(3次以上J并存)

                 J{3,5}     JJJ或JJJJ或JJJJJ




(12) ? 匹配前面表达式0次或一次

                 非贪婪模式匹配

                 ja? j或者ja

                 do(es)?   do或does

四、 量词

----------------------------------------------------------------------------

    a? 可以匹配空字符串“” 可以匹配“a”串两次(一次是a 一次是结尾空串) 可以匹配“aaa”四次(三个a和一个结尾空串) 可以匹配“aaabab”七次(单独的a四次,非a处(b)匹配两次,结尾空串一次)          

       

      a* 可以匹配空字符串“” 可以匹配“a”串两次(一次是a 一次是结尾空串) 可以匹配“aaa”两次(一个aaa和一个结尾空串)可以匹配“aaabab”五次(aaa一次,a一次,非a处(b)匹配两次,结尾空串一次)


      a+ 只能匹配多个“a”的串  

      a{3} 匹配“aaa”一次 匹配“aaaaa”一次 匹配“aaaaaa”两次(aaa和aaa)

      a{3,} 匹配“aaaaaa”一次

      a{3,6} 匹配“aaaaaaaaa”两次(一次aaaaaa,一次aaa)

      abc+ 匹配“abc”,“abcc”,“abcccc...” 量词仅仅可能附在一个字符后面一次(此处依附的是c)

      [abc]+ 匹配的是一个以上的abc中的字符组成的串

      (abc)+   匹配的是一个以上的abc串 如abc, abcabcabc


五、贪婪式、勉强式、侵占式

----------------------------------------------------------------------------

<.*>     贪婪式 匹配了  

              &#xff08;1&#xff09;首先吞掉整个字符串&#xff0c; <匹配 <&#xff0c;然后.*匹配abbb>&#xff0c;发现无法匹配 > 之后&#xff0c;回退一个字符&#xff08;>&#xff09;

             &#xff08;2&#xff09;此时可以匹配

              从后向前回退


      <.*?> 勉强式 匹配了  

                  首先 <匹配 <&#xff0c;吞掉a&#xff0c;吞掉b&#xff0c;吞掉b&#xff0c;吞掉b&#xff0c;发现 > 可以匹配

                从前向后吞并


      <.*&#43;> 侵占式 无法匹配

                   首先 <匹配 <&#xff0c;然后.*匹配abbb>&#xff0c;发现无法匹配 > 之后&#xff0c;不回退&#xff0c;直接汇报无法匹配

                一次匹配结束

 

      对于待匹配串 xfooxxxxxxfoo

         .*foo 贪婪式 &#xff08;1&#xff09;吞掉整个串&#xff0c;不匹配 &#xff08;2&#xff09;回退一个o&#xff0c;不匹配

                             &#xff08;3&#xff09;回退一个o&#xff0c;不匹配           &#xff08;4&#xff09;回退一个f&#xff0c;匹配 xfooxxxxxxfoo

         .*?foo 勉强式 &#xff08;1&#xff09;匹配x&#xff0c;匹配foo &#xff08;2&#xff09;继续&#xff0c;匹配xxxxxx&#xff0c;匹配foo

         .*&#43;foo 侵占式 吞掉所有串&#xff0c;无法匹配foo&#xff0c;不回退&#xff0c;匹配失败


六、捕捉组

----------------------------------------------------------------------------    

反向引用&#xff1a;在正则表达式中&#xff0c;反向引用使用反斜线&#xff08;\&#xff09;后跟一个表示需要再调用组号的数字来表示。

              例如&#xff0c;表达式(\d\d)定义了匹配一行中的两个数字的捕获组&#xff0c;通过反向引用\1&#xff0c;表达式稍候会被再次调用。

(\d\d)\1 匹配1212&#xff0c;而不能匹配1234 两组数字相同


七、边界匹配

 ----------------------------------------------------------------------------        

反向引用&#xff1a;在正则表达式中&#xff0c;反向引用使用反斜线&#xff08;\&#xff09;后跟一个表示需要再调用组号的数字来表示。

              例如&#xff0c;表达式(\d\d)定义了匹配一行中的两个数字的捕获组&#xff0c;通过反向引用\1&#xff0c;表达式稍候会被再次调用。

(\d\d)\1 匹配1212&#xff0c;而不能匹配1234 两组数字相同        


八、Pattern类的方法

    ----------------------------------------------------------------------------        

      &#xff08;1&#xff09;关于complain方法的第二个参数&#xff08;整数&#xff09;(可用位操作符|表示并列)

举例&#xff1a;pattern &#61; Pattern.compile("[az]$", Pattern.MULTILINE | Pattern.UNIX_LINES)        


           |-----------------------------------|-------------------|------------------------------------------------|

           |    使用标志构建模式                  |  内嵌标志表达式  |                 意义                                        |

           |-----------------------------------|-------------------|-------------------------------------------------|      

           | Pattern.CASE_INSENSITIVE    | 等价于(?i)         | 不区分大小写                                            |

          | Pattern.COMMENTS               | 等价于(?x)         | 忽略空白和以#开始的直到行尾的内嵌注释       |

           | Pattern.DOTALL                     | 等价于(?s)         | 表达式.匹配包括行结束符在内的任意字符         |

          |-----------------------------------|--------------------|------------------------------------------------|        

        &#xff08;2&#xff09;matches方法返回boolean方法

                Pattern.matches("\\d","1")

          &#xff08;3&#xff09;matcher方法返回Matcher类对象

                Pattern.matcher("待匹配字串")

        &#xff08;4&#xff09;split(方法

                Pattern pattern1 &#61; Pattern.compile("[, |]");  

                String[] strs &#61; pattern1.split("Java Hello World  Java,Hello,,World|Sun");

九、Matcher类的方法

----------------------------------------------------------------------------        

     

     &#xff08;1&#xff09;索引方法

                 start()                            匹配索引开始

                 start(int group)               组匹配索引开始

                end()                              匹配索引结束

                 end(int group)                组匹配索引结束    

     &#xff08;2&#xff09;研究方法

                matches()       boolean b&#61; matcher.matches()     将整个匹配串与正则进行匹配的boolean值

                find方法&#xff0c;查找下一个匹配的字符串序列,相当于rs.next

   

while (matcher.find()){System.out.printf(matcher.group(), matcher.start(), matcher.end() );}


            find(int index) 从索引处开始

            lookingAt()  与matches不同&#xff0c;这个从头匹配&#xff0c;有即可。

     &#xff08;3&#xff09;替换方法

        replaceFirst方法替换一个&#xff0c; matcher.replaceFirst(String s);

        replaceAll方法替换所有匹配&#xff08;参数是替换串&#xff09; matcher.replaceAll(String s);


        str.replaceAll(regex, repl)方法与使用 Pattern.compile(regex).matcher(str).replaceAll(repl)    


十、参考

http://www.java3z.com/cwbwebhome/article/article8/Regex/Java.Regex.Tutorial.html





转:https://my.oschina.net/jiler/blog/552077



推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了在Java中检查字符串是否仅包含数字的方法,包括使用正则表达式的示例代码,并提供了测试案例进行验证。同时还解释了Java中的字符转义序列的使用。 ... [详细]
author-avatar
阿加芬散阿加芬散
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有