Java:正则表达式:基础语法,Matcher 对象的方法 lookingAt()、matches()、find()和groupCount()
一、正则表达式基础语法(Regular Expression)
1、正则表达式的创建方式:Pattern.compile(“正则表达式”).matcher(“被检验的字符串”)
伪代码
Pattern p = Pattern.compile(regex);
// Pattern p = Pattern.compile("正则表达式");
Matcher m = p.matcher(input);
// Matcher m = p.matcher(“被检验的字符串”);
2、分组()和分隔|
(1)| 用于分割可供选择的字符,要与 ( ) 搭配使用,存在优先匹配:从左到右(从繁到简)。注意与 [ ] 搭配,就是他本身 |,不代表分割。
如 [ab|cd],既可以匹配 ab 也可以匹配 cd。
选择项的尝试匹配次序是左——>右,因此,[a | ab]中当a匹配之后,就不匹配 ab 了,即使 ab 更优。所以书写顺序应该是从繁到简。
(2)() 分组,作用1:把一部分作为整体;作用2:定义子模式方便后面引用
作为整体,加上重复次数,如
String regex = "(\\D\\s)+";
效果相同
3、\转译^$.*+?=|!/:{}()[] 、字符类、重复次数、位置锚点、修饰符
(1)特殊字符,^$.*+?=|!/:{}()[] 需要\转译
\o \t \n \v \f \r
^$.*+?=|!/:{}()[] \需要\转译
(2)字符类,[\w\W\s\S\d\D]
符号 | 意义 |
---|---|
[...] | 字符集。匹配包含的任何字符 |
[^...] | 反向字符集。匹配未包含的任何字符 |
[a-b] | 字符范围。匹配包含的任一字符集 |
[^a-b] | 反向范围字符。匹配不在指定范围内的任何字符 |
. | 任意字符 |
\\w | 任何ASCII字符组成的单词,等价于[a-zA-Z0-9] |
\\W | 任何不适ASCII字符组成的单词,等价于[^a-zA-Z0-9] |
\\s | 任何Unicode空白符 |
\\S | 任何非Unicode空白符的字符,注意\w和\S不一样 |
\\d | 任何ASCII数值,等价于[0-9] |
\\D | 任何ASCII数字之外的任何字符,等价于[^0-9] |
\\数字 | 数字需要是正整数,到捕获匹配的反向引用 |
(3)重复次数,?+*{n}{n,}{m,n}
符号 | 意义 |
---|---|
? | 0或1次 |
+ | 1次或多次 |
* | 任意次 |
{n} | n次 |
{n,} | n次或n次以上 |
{m,n} | 最少m次,最多n次 |
正则是贪婪的,在全体满足匹配条件的情况下,尽可能贪婪。
(4)位置锚点,^$\b\B(?=p)(?!p)
符号 | 意义 |
---|---|
^ | 匹配字符串的开头,在多行检测中,匹配一行的开头 |
$ | 匹配字符串的结尾,在多行检测中,匹配一行的结尾 |
\\b | 匹配一个单词边界的位置 |
\\B | 匹配非单词边界的位置 |
(?:pattern) | 匹配pattern但不捕获该匹配的子表达式 |
(?=pattern) | 零宽正向先行断言(要求接下来的字符都与p匹配,但不能包含匹配p的那些字符) |
(?!pattern) | 零宽负向先行断言(要求接下来的字符不与p匹配) |
二、lookingAt()、matches()、find()
返回对应的布尔值
lookingAt()是从开始位置开始匹配
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
//lookingAt是从开始位置开始匹配
System.out.println(m.lookingAt());
matches()是从开始位置开始匹配
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
//matches方法是将输入和正则表达式模式完全做匹配:
System.out.println(m.matches());
find()是从开始位置开始匹配
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
//find是查找是否包含
System.out.println(m.find());