【学习笔记】正则表达式

92 阅读3分钟

1. 标准字符集

表达式匹配内容
\n换行符
\t制表符
\\本身
\d数字
\w字母、数字、下划线
\s空格、制表符、换行符等空白字符
\S非空白字符
.非换行符
\x当x不是特殊字符时,匹配x自身。详细点这里

2. 自定义字符集

表达式匹配内容备注
[abc]'a','b','c'中的一个
[^abc]除了'a','b','c'的字符^在中括号第一位表示取反,不在第一位表示^自身;^不在中括号表示以什么开头
[a-z]小写字母
[0-9]数字
[a-z0-9]小写字母和数字
[\d]数字标准字符集放到中括号里也有效,小数点除外
[.].本身小数点放到中括号仅能匹配小数点自身

3. 量词

表达式匹配内容备注
a{2}连续两个'a'{x}表示数量x个
\d{6}连续6个数字
\d{2,3}连续2个或3个数字{x,y}表示最少x个,最多y个。默认是贪婪模式,匹配得越多越好,即越接近y越好
\d{3,}最少连续3个数字
\d?0个或1个数字等价于\d{0,1}
\d+最少连续1个数字等价于\d{1,}
\d*连续任意个数字等价于\d{0,}

4. 边界字符,这类符号用于表示位置

符号解释例子
^以什么开始^a,以a开头
$以什么结束a$,以a结束
\b单词边界,边界的左边和右边不能都是\wabc\b,可以匹配"abc "中的"abc",因为'c'后面是空格;但不能匹配"abc123"中的"abc",因为'c'后面是数字

5. 捕获组

  使用括号进行分组后,再用\n进行引用;n是从1开始的数字,表示组号,若不想给分组分配组号可以使用(?:)。例子如下图所示:

003-01.png
  [a-z]{3}表示连续3个字母,把它放进括号就对其进行了分组,\1就可以引用它,类似于申请了一个变量\1,其内容是连续3个字母。所以该表达式就是匹配两组相同的连续3个字母。
  若有多个分组,则用\1\2等(注:组号是按照左括号的出现顺序来分配的)来引用,如下图所示: 003-02.png

6. 预搜索

表达式文本匹配结果解释
abc(?=123)abc123abc(?=)表示后面应该出现什么,所以能匹配到"abc123"中的"abc"
abc(?!123)abc123(?!)表示后面应该出现什么,所以不能匹配到"abc123"中的"abc",但是可以匹配"abc222"中的"abc"
(?<=123)abc123abcabc(?<=)表示前面应该出现什么,所以能匹配到"123abc"中的"abc"
(?<!123)abc123abc(?<!)表示前面应该出现什么,所以不能匹配到"123abc"中的"abc",但是可以匹配"222abc"中的"abc"

7. 例子

  • 校验字符串是否有中文

    public void regexTest() {
        String regex = "^[^\u4e00-\u9fa5]{0,}$";
        String msg = "aaaa啊";
        if (Pattern.matches(regex, msg)) {
            System.out.println("没有中文");
        } else {
            System.out.println("有中文");
        }
    }
    

8. 相关链接