热门标签 | 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



推荐阅读
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了PHP常量的定义和使用方法,包括常量的命名规则、大小写敏感性、全局范围和标量数据的限制。同时还提到了应尽量避免定义resource常量,并给出了使用define()函数定义常量的示例。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用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社区 版权所有