前言
正则表达式是一种强大而灵活的文本处理工具。提供了一种完全通用的方式,能够解决各种字符处理相关的问题:匹配、选择、编辑及验证
一、基础
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。例如:要描述一个整数,它可能有以为或多位数字,在正则表达式中,可以用 \d 表示一位数字。
应用正则表达式的最简单的方法,就是利用String类内建的功能。例如可以检查一个String是否匹配指定的正则表达式:
代码如下:
public class IntergerMatch{
public static void main(String[] args){
System.out.println("abc".matcher("[a-z]+"));
System.out.println("123".matcher("-?\\d+"));
System.out.println("-123".matcher("-?\\d+"));
System.out.println("+123".matcher("(-|\\+)?\\d+"));
}
}
在Java中,\\的意思是“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊意义。”例如,如果你想表示一位数字,那么正则表达式应该是\\d。如果你想插入一个普通的反斜线,则应该是\\\\。
二、创建正则表达式
正则表达式的完整构造子列表,请参考JDK文档java.util.regex包中的Pattern类。
字符类 | |
---|---|
. | 任意字符 |
[abc] | 包含a、b和c的任何字符(与a |
[^abc] | 除了a、b和c的任何字符 |
[a-zA-Z] | 从a到z或从A到Z的任何字符 |
\s | 空白符(空格、tab、换行、换页和回车) |
\S | 非空白符([^\s]) |
\d | 数字[0-9] |
\D | 非数字[^0-9] |
\w | 词字符[a-zA-Z0-9] |
\W | 非词字符 |
逻辑操作符 | |
---|---|
XY | Y跟在X后面 |
X|Y | X或Y |
(X) | 捕获组。可以在表达式中用\i引用第i个捕获组 |
边界匹配符 | |
---|---|
^ | 一行的起始 |
$ | |
\b | 词的边界 |
\B | 非词的边界 |
\G | 钱一个匹配的结束 |
三、量词
量词描述了一个模式吸收输入文本的方式:
- 贪婪型:量词总是贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配。
- 勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符。因此也称作懒惰的、最少匹配的、非贪婪的、或不贪婪的。
- 占有型:目前,这种类型的量词只在Java中才可用,并且也更高级。
贪婪型 | 勉强型 | 占有型 | 如何匹配 |
---|---|---|---|
X? | X?? | X?+ | 一个或零个X |
X* | X*? | X*+ | 零个或多个X |
X+ | X+? | X++ | 一个或多个X |
X{n} | X{n}? | X{n}+ | 恰好n次X |
X{n,} | X{n,}? | X{n,}+ | 至少n次X |
X{n,m} | X{n,m}? | X{n,m}+ | X至少n次,且不超过m次 |
注意:表达式X通常必须要用括号括起来,以便它能够按照我们所期望的效果去执行。例如:abc+,如果不括起来,这个表达式表示的是:匹配ab,后面跟随一个或多个c。要表明匹配一个或多个完整的abc字符串,则要这样表示:[abc]+。