正则表达式
正则表达式(Regular Expression,regex)是一种文本模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
匹配普通单个字符
1.直接写某个字符匹配该字符
2.采用"[]"来匹配中括号里的其中一个字符
3.使用转义字符匹配
正则表达式 | 匹配字符 |
s | s |
[ab,cd] | a 或 b 或 ',' 或 c 或 d |
[^ab] | 匹配不是a或b的字符 |
[A-Za-z0-9_] | 匹配大写字母、小写字母、数字、下划线中的其中一个 |
. | 匹配任意一个字符(除了换行符(\n、\r))相等于 [^\n\r]。 |
[.]或\. | 匹配 '.' |
\\ | 匹配 '\' |
\w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等 |
\S | 匹配任何非空白字符 |
\d | 匹配数字0-9 |
\D | 匹配不是数字的字符 |
使用"()"标记一个子表达式的开始和结束位置。如 (abc) 匹配 abc
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。 |
? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。 |
{n,} | n 是一个非负整数。至少匹配n 次。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
* 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配。
边界匹配
特别字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置 |
^ | 匹配输入字符串的开始位置 |
\b | 匹配一个单词边界 |
\B | 非单词边界匹配 |
Java 正则表达式
Java语言提供了对正则表达式的支持,与正则表达式有关的类在java.util.regex 包中,主要包括以下三个类:
- Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
- Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
- PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
String类的matches方法,实质上就是调用Pattern类的matches方法
需要注意的是,在 Java 中,\\ 表示插入一个正则表达式的反斜线,以使其后的字符具有特殊的意义。
即在 Java 中正则表达式中需要有两个反斜杠才能被解析为转义作用。
也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\。