首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则表达式的一些实用技巧

正则表达式的一些实用技巧

作者头像
大神带我来搬砖
发布2018-05-02 14:10:18
7680
发布2018-05-02 14:10:18
举报

原来写过一篇关于正则表达式的文章,这里再补充几个实际项目中用到的例子.注意:下面样例都是scala代码

1 捕获组命名 使用捕获组的时候,程序员可能需要趴在显示器上,用一张纸挡着屏幕,从左往右数括号,聚精会神好像拆弹,而且正则表达式一旦发生变化,group的index也会变.有洁癖的程序员不愿意忍受下面的代码中的那个2

val matcher = Pattern.compile("""(中标金额:|预算:)(\d+)元""").matcher("预算:4356元")
if (matcher.find()) {
  println(matcher.group(2))
}

因此可以把捕获组命名

val matcher = Pattern.compile("""(中标金额:|预算:)(?<budget>\d+)元""").matcher("预算:4356元")
if (matcher.find()) {
  println(matcher.group("budget"))
}

2 零宽度断言 零宽度断言只用来判断,而不会消费字符串,不会影响其他部分的匹配. 先举一个负向断言的例子,假设有几个文件全名,"file1.mp3", "file2.bat", "file3.txt",需要把文件名和扩展名都提取出来,在这个过程中,需要忽略所有bat文件.要是用普通代码实现,至少需要两个步骤——分隔和判断,但是正则表达式写一个就行了,用来面试别人,效果非常好

    val pattern = Pattern.compile("""(\w+)\.(?!bat|mp3)(\w+)""")
    Array(
      "file1.mp3",
      "file2.bat",
      "file3.txt"
    ).foreach(s => {
      val matcher = pattern.matcher(s)
      if (matcher.find()) {
        println(matcher.group(1) + " " + matcher.group(2))
      }
    })

至于正向断言,在2012年以后的很长一段时间,我都没想明白它到底有什么实际的作用,能用正向断言时为什么不用非捕获组. 后来终于找到了一个可以名正言顺使用正向断言的例子,用正则表达式来实现,效果拔群,立竿见影,感觉特别奇技淫巧.那就是密码强度判断,比如要求密码8到12位,必须有大小写字母和数字

    val pattern = Pattern.compile("""^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{8,12}""")
    Array(
      "qweqwe123",
      "QWer56",
      "QWEqwe123"
    ).foreach(s => {
      val matcher = pattern.matcher(s)
      println(matcher.matches())
    })

断言的好处是可以要求同时出现而且没有先后顺序

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.03.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档