47正则表达式

什么是正则表达式

  • 用于描述文本/字符串的一组规则
  • 你可以使用一些强大的规则来:
    • 处理文本
    • 提取信息

为什么要学习正则表达式?

  • 实用、强大、程序员必备
    • 在支持正则表达式的文本编辑器中提高工作效率
    • 用很少的代码完成复杂的文本提取工作
  • 难学、难懂、反人类
    • 一开始觉得难是正常的
    • 需要长期的实践才能掌握
  • 如何学习和读懂正则表达式
    • 耐心分解,一点点分析
    • 多用在线工具验证自己的想法

回忆一下通配符

  • Is *.txt
  • Windows的资源管理器搜索*.txt

Java中的转义字符

  • 为什么需要转义字符?
    • 因为有的字符不可见,无法用一个键来代表
  • 最常用的转义字符
  • \n
  • \r
  • \t
  • \” \'
  • \
  • \uXXXX

常用的元字符

^ 开始位置
$ 结束位置
. 单个任意字符(不一定包含换行符)
\w 单个“word”字符字母/数字/下划线/汉字
\s 单个空白字符(\n\r\t)
\d 单个数字字符
\b 单词的开始或结束
  • 当然,用到它们的原来的意思的时候,需要转义

重复

* 0次或多次
+ 1次或多次
? 0次或1次
{n} n次
{n,} >=n次
(n,m} n到m次
  • 当然,用到它们的原来的意思的时候,需要转义

选择

[aeiou] 单个的a/e/i/o/u字符之一
[0-9] 单个数字字符
[A-Z] 单个大写字母
[A-Z0-9_] 大写字母或者数字或者下划线
Hi|hi 等价于[Hh]i Hi或者hi
  • 当然,用到它们的原来的意思的时候,需要转义

反义

[^aeiou] 单个的除a/e/i/o/u之外的字符
[^A] 单个非X字符
\W 单个非\W (字母/数字/下划线/汉字)
\S 单个非\s (空白)<br/
\D 单个非\d(数字)字符
\B 非开头/结束位置
  • 当然,用到它们的原来的意思的时候,需要转义

我们先来看一些例子

^\d{5,12}$ 5到12位的数字
^(0|[1-9][0-9]*)$ 0或者非零开头的数字
^(-?\d+)(.\d+)?$ 小数
\d{3}-\d{8}|\d{4}-\d{7,8} 国内的电话号码
^\d{4}-\d{1,2}-\d{1,2} yyyy-MM-dd日期格式
\n\s*\r 空白行

Java中的正则表达式

  • String
    • split()
    • replaceAll/replaceFirst
    • matches
  • matches
    • 尽量少用或者少编译,因为效率低
    • Java中的正则表达式是比较昂贵的
    • 正则表达式需要解析,代码非常昂贵
    • 匹配过程非常昂贵

实战练习!

  • 分割字符串1.2.3
  • 将文本中的空白字符全部替换掉
  • 匹配一个多行字符串

分组与捕获

  • 想要将所有符合正则表达式的文本抓出来处理
    • 使用括号来指定一个被捕获的分组
    • 分组的编号从1开始
    • 分组的编号计算只看左括号
    • (?:)不捕获和分配编号,括号只用于分组或标记优先级

在Java中处理捕获

  • Pattern
    • matcher()
    • Pattern的编译是一个很昂贵的操作,应该尽可能放到全局变量中,编译一次,长久使用,而不是放在方法里,每次都重新编译
  • Matcher
    • find()
    • group(n)

实战练习!

  • 使用正则表达式处理GC log

「资料来源:饥人谷」

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注