摘要

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

java
 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());
}

验证(...)(?:...)

java
 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("未匹配");
    }
}