正则表达式语法
1\ 单个字符
字符类 | 解释 |
---|---|
[ C1 C2 … ] | 表示任何 一个 可以从C1 C2 …中取值的字符 |
[^ … ] | 该字符集的补集 |
[ … && … ] | 两个字符集的交集 |
预定义字符类 | 解释 |
---|---|
. | 可以代表除了终止符之外的任意字符(DOTALL标志设置后,可代表所有字符) |
\d | 代表一个数字 [0-9] |
\D | 小写 \d 的补集,代表一个非数字 [^0-9] |
\s | 一个空白字符 [\t\n\r\f] |
\S | 小写 \s 的补集,一个非空白字符 |
\w | 一个词语字符 [a-zA-Z0-9_] |
\W | 小写 \w 的补集,一个非词语字符 |
边界匹配符 | 解释 |
---|---|
^ | The beginning of a line |
$ | The end of a line |
\b | 一个 word 的边界 |
\B | \b的补集 |
\A | The beginning of the input |
\z | The end of the input(不能有结尾终止符\n,\r,\r\n,就是单纯的 input end) |
\Z | The end of the input (但是结尾终止符可有可无) |
G | 前一个匹配的结尾 |
具体参考博文:
正则表达式边界符中的 ^, $, \A, \Z, \z: link
【Java正则表达式系列】8 Boundary Matcher(边界匹配): link
2\ 量词
量词 | 解释 |
---|---|
X? | 0 或 1个 |
X* | 0 或 多个 |
X+ | 1 或 多个 |
X{n} X{n,} X{n, m} | 重复n次,至少n次, 重复n到m之间次 |
量词后缀 | 解释 |
---|---|
? | 勉强匹配(懒惰匹配)(Reluctant) |
+ | 占有匹配 (Possessive) |
默认 | 贪婪匹配 |
三种策略 理解来说就是:
Greedy - 匹配pattern所能成功匹配的最长串
Reluctant - 匹配pattern所能成功匹配的最短串
Possessive - 尽可能多的去匹配,量词部分一旦匹配成功,就不再改变,可能会造成后面group的匹配失败
具体参考博文:
Java 正则表达式——贪婪匹配、惰性匹配、支配匹配 link
正则表达式的三种模式 link
3\ 群组
群组 | 解释 |
---|---|
(X) | 群组匹配 |
具体参考博文:
Java 正则表达式 link
java正则表达式中Group的理解 link
JAVA正则表达式-捕获组与非捕获组 link
Pattern & Matcher
1\ Pattern API
static Pattern compile(String regex)
static Pattern compile(String regex, int flags)
Matcher matcher(String inputStr)
简单了解compile的标志:
flag | 解释 |
---|---|
Pattern.CASE_INSENSITIVE | 匹配时忽略大小写 |
Pattern.UNICODE_CASE | |
Pattern.DOTALL | “.” 匹配包括行终止符的所有字符 single-line mode |
Pattern.MULTILINE | ^和$匹配行的结尾 multi-line mode |
Pattern.UNIX_LINES | |
Pattern.CANON_EQ |
2\ Matcher API
//三种不同类型的匹配操作
public boolean lookingAt()
public boolean find()
public boolean find(int startIndex)
public boolean matches()
----------------------------------------
//分组 匹配
public int start()
public int start(int groupId)
public int end()
public int end(int groupId)
String group()
String group(int groupId)
int groupCount()
----------------------------------------
//替换
public String replaceAll(String replacement)
public String replaceFirst(String replacement)
----------------------------------------
//重置
Matcher reset()
Matcher reset(CharSequence input)
三种匹配操作 理解来说就是:
matches 匹配整个目标字符串
lookingAt 部分匹配,总是从第一个字符开始进行匹配
(类似于String类的 startsWith 方法
find 部分匹配,找到一个匹配的子串,将后移下次匹配的位置
具体参考博文:
java matcher 中find,matches,lookingAt三个方法的区别 link
JAVA正则表达式(matches 和 lookingAt 方法) link
3\ 简单的例子
最后举一个正则表达式的使用例子:参考W3Cschool的java教程
下面是一个对单词"cat"
出现在输入字符串中 出现次数 进行计数的例子:
----------------------------------------------
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches
{
private static final String REGEX = "\\bcat\\b";
private static final String INPUT = "cat cat cat cattie cat";
public static void main( String args[] ){
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // 获取 matcher 对象
//简化: Matcher m = Pattern.compile(REGEX).matcher(INPUT);
int count = 0;
while(m.find()) {
count++;
System.out.println("Match number "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
-----------------------------------
//以上实例编译运行结果如下:
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22