作家
登录

令人抓狂的代码 - 万能正则表达式.*陷阱

作者: 来源: 2017-10-24 16:07:29 阅读 我要评论

启用dotall模式。在dotall模式下,模式中的.匹配随便率性字符,包含换行符。在默认情况下(即未启用dotall模式),.不匹配换行符。等价于润饰符(?s)。


启用Unix换行模式,应用"\n"标识每一行的末尾,等价于润饰符(?d)。

令人抓狂的代码 - 全能正则表达式.*陷阱

先测验测验履行下面的代码:

  1. println("play \n scala".matches(".*")) 

你没看错,打印结不雅是false。正如键盘构造一样,这是因为一个汗青问题导致的。早期的┞俘则表达式对象是基于行处理文本的,所以.匹配的是除换行符以外的随便率性字符。大年夜多半编程说话在设计正则表达式时沿用了这个传统,然则供给一个选项用于开启"点号匹配换行符"模式。

沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!

Java供给了两种方法开启"点号匹配换行符"模式,第一种方法是在构建Pattern对象时指定匹配模式:

  1. val p = Pattern.compile(".*", Pattern.DOTALL) 
  2.  
  3. println(p.matcher("play\nscala").matches()) // true 

另一种方法是在正则表达式开端地位指定嵌入模式润饰符(embedded mode modifier),这也是一种比较通用的方法:

  1. println("play\nscala".matches("(?s).*")) // true 

Java常用的匹配模式有以下几种:

1) Pattern.DOTALL

  1. val p = Pattern.compile(".*", Pattern.DOTALL) 
  2. val m = p.matcher("play\nscala"
  3. println(m.matches()) 
  4. // 输出 
  5. true 

2)Pattern.MULTILINE

启用多行匹配模式。在多行匹配模式下,模式中的^和$将逐次匹配每一行的行首和行尾。在默认情况下(即未启用多行匹配模式),^和$将匹拍┞符个字符串的首部和尾部。等价于润饰符(?m)。

  1. val p = Pattern.compile("^.*$", Pattern.MULTILINE) 
  2. val m = p.matcher("play\nscala"
  3. while (m.find()) { 
  4.   println("find: " + m.group(0)) 
  5.  
  6. // 输出 
  7. find: play 
  8. find: scala 

3) Pattern.UNIX_LINES

  1. val p = Pattern.compile("^.*$", Pattern.UNIX_LINES | Pattern.MULTILINE) 
  2. val m = p.matcher("play\r\nscala"
  3. while (m.find()) { 
  4.   println("find: " + m.group(0).length) 
  5. // 输出 
  6. find: 5 
  7. find: 5 

输出的两个结不雅长度都为5,原因是play末尾还有一个字符\r。

4)Pattern.CASE_INSENSITIVE

启用大年夜小写不敏感匹配,等价于润饰符(?i)。

  1. val p = Pattern.compile("^S.*A$", Pattern.CASE_INSENSITIVE) 
  2. val m = p.matcher("scala"

      推荐阅读

      中看不中用?四招教你解决主机散热布局

    沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散! 在散热不好的平台中,高机能的硬件不仅不克不及发挥实力,还会受到高温的影响而降频,反而会降低整机机能,>>>详细阅读


    本文标题:令人抓狂的代码 - 万能正则表达式.*陷阱

    地址:http://www.17bianji.com/lsqh/38144.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)