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



推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
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社区 版权所有