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



推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 本文介绍如何使用Java中的正则表达式来提取字符串中的特定值。通过示例代码和详细解释,帮助开发者掌握正则表达式的使用方法,尤其是如何匹配和提取复杂模式中的数据。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 5G至4G空闲态移动TAU流程解析
    本文详细解析了用户从5G网络移动到4G网络时,在空闲态下触发的跟踪区更新(TAU)流程。通过N26接口实现无缝迁移,确保用户体验不受影响。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
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社区 版权所有