摘要
2019年的时候,其实记录过正则表达式的使用,不过相对来说,太过肤浅了。因此像Git一样,又重新记录一版。
正文
正则表达式中,整理元素的含义列表如下
| 元素 | 含义 |
|---|
| * | 重复0次或者多次 |
| + | 重复1次或者多次 |
| ? | 重复0次或者1次 |
| . | 匹配任意字符,除了换行符 |
| ^ | 匹配字符串开头 |
| $ | 匹配字符串结尾 |
| - | 表示字符范围。如a-z,表示选择字母的范围为从a到z |
| [...] | 匹配中括号内任意一个字符 |
| [^...] | 匹配中括号内除列举的字符以外的任意字符 |
| (...) | 捕获分组,用于匹配并捕获匹配字符串的部分 |
| (?:...) | 非捕获分组,用于匹配且不捕获匹配字符串的部分。可以提高正则表达式的性能,减少内存开销 |
| | | 逻辑or,匹配左右任意一个表达式 |
| \d | 匹配任意数字,相当于[0-9] |
| \D | \d的else含义 |
| \w | 匹配任意字母、数字、下划线,相当于[a-zA-Z0-9_] |
| \W | \w的else含义 |
| \s | 匹配任意空白字符,包括空格、制表符等 |
| \S | \s的else含义 |
| \b | 匹配一个单词的边界,即单词字符和非单词字符之间的位置。一个单词字符是指字母、数字或下划线。 |
| \B | \b的else含义,即两个单词字符或两个非单词字符之间的位置。 |
| {n} | 匹配前一个元素n次 |
| {n,} | 匹配前一个元素至少n次 |
| {n,m} | 匹配前一个元素至少n次,但不超过m次 |
元素的优先级顺序如下
| 优先级 | 元素 |
|---|
| 1 | () |
| 2 | \ |
| 3 | {}、 *、 +、 ? |
| 4 | ^、 $、 \b、 \B |
| 5 | []、 - |
| 6 | | |
验证\b与\B
1
2
3
4
5
6
7
8
9
10
11
12
| public static void main(String[] args) {
String input1 = "!word";
String input2 = "aword!";
String regex = "\\Bword\\b";
Pattern pattern = Pattern.compile(regex);
// false
// !与w是非单词字符和单词字符,属于\b, d与结尾属于单词字符与非单词字符,属于\b
System.out.println(pattern.matcher(input1).find());
// true
// a与w是单词字符和单词字符,属于\B,d与!是单词字符和非单词字符,属于\b
System.out.println(pattern.matcher(input2).find());
}
|
验证(...)与(?:...)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| public static void test2() {
//使用捕获分组
String c = "(\\d{3})-(\\d{3}-\\d{4})";
//使用非捕获分组
String nc = "(?:\\d{3})-(\\d{3}-\\d{4})";
String phoneNumber = "123-456-7890";
Pattern cPattern = Pattern.compile(c);
Matcher cMatcher = cPattern.matcher(phoneNumber);
if (cMatcher.matches()) {
System.out.println("捕获分组结果: ");
System.out.println("区号: " + cMatcher.group(1));
System.out.println("电话号码: " + cMatcher.group(2));
} else {
System.out.println("未匹配");
}
System.out.println();
Pattern ncPattern = Pattern.compile(nc);
Matcher ncMatcher = ncPattern.matcher(phoneNumber);
if (ncMatcher.matches()) {
System.out.println("非捕获分组结果: ");
System.out.println("电话号码: " + ncMatcher.group(1));
} else {
System.out.println("未匹配");
}
}
|