目录
什么是正则表达式
- 用于描述文本/字符串的一组规则
- 你可以使用一些强大的规则来:
- 处理文本
- 提取信息
为什么要学习正则表达式?
- 实用、强大、程序员必备
- 在支持正则表达式的文本编辑器中提高工作效率
- 用很少的代码完成复杂的文本提取工作
- 难学、难懂、反人类
- 一开始觉得难是正常的
- 需要长期的实践才能掌握
- 如何学习和读懂正则表达式
- 耐心分解,一点点分析
- 多用在线工具验证自己的想法
回忆一下通配符
- 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
「资料来源:饥人谷」