正则表达式
2021-09-07 本文已影响0人
bowen_wu
概述
正则表达式 => 用于描述文本 | 字符串的一组规则 => 处理文本 + 提取信息
转义字符
有的字符看不见,无法用一个键来表示。常见转义字符
-
\n=> 换行符 \r-
\t=> 制表符 -
\"&\' -
\\=> 反斜杠
元字符
-
^=> 开始位置 -
$=> 结束位置 -
.=> 单个任意字符(不一定包含换行符)=> Java 中声明.要匹配换行符,默认不匹配换行符 =>(?s). -
\w=> 单个 word 字符,字符 | 数字 | 下划线 | 汉字 -
\s=> 单个空白字符\n+\r+\t -
\d=> 单个数字字符 digit -
\b=> 单词的开始或结束
当要使用元字符原有的含义,需要转义
重复
-
*=> 0次 或 多次 -
+=> 1次 或 多次 -
?=> 0次 或 1次 -
{n}=> n次 -
{n,}=> >=n次 -
{n, m}=> n到m次
当要使用上述字符原有的含义时,需要转义
选择
-
[aeiou]=> 单个 a | e | i | o | u 字符之一 -
[0-9]=> 单个数字字符 -
[A-Z]=> 单个大写字母 -
[A-Z0-9_]=> 大写字母或者数字或者下划线 -
Hi|hi === [Hh]i=> Hi 或者 hi
当要使用上述字符原有的含义时,需要转义
反义
-
[^aeiou]=> 单个除 a | e | i | o | u 之外的字符 -
[^x]=> 单个非 x 字符 -
\W=> 单个非\w(字母 | 数字 | 下划线 | 汉字) -
\S=> 单个非 \s(空白) -
\D=> 单个非 \d(数字)字符 -
\B=> 非开头 | 结束位置
当要使用上述字符原有的含义时,需要转义
Java 中的 RegExp
Java 中的正则表达式是比较昂贵的
- 正则表达式需要解析 =>
java.util.regex.Pattern.compile=>private static final Pattern SOME_PRECOMPILED_PATTERN = Pattern.compile("非常复杂的正则表达式"); - 匹配过程非常昂贵 => 当匹配特别复杂的正则表达式时会发生栈溢出 => 正则表达式匹配的过程是一个回溯的过程
java.lang.String
- split
- replaceAll | replaceFirst
- matches => 效率非常低
分组 & 捕获
Pattern telPattern = Pattern.compile("//d{3}-//d{8}");
Matcher matcher = telPattern.matcher("021-32413143\n345-32415343");
while (matcher.find()) {
System.out.println(matcher.group(0)); // 021-32413143 | 345-32415343
System.out.println(matcher.group(1)); // 021 | 345
}
可以将所有符合正则表达式的文本抓出来处理
- 使用括号 () 来指定一个被捕获的分组
- 分组的编号从 1 开始,0 是匹配的字符串
- 分组的编号计算只看左括号
- (?:)不捕获和分配编号,括号只用于分组或标记优先级
Java 处理捕获
- Pattern.matcher
- Matcher.find() & Matcher.group()
知识点
- window 换行符
/r/nUNIX 换行符/n - slash -> 斜杠
- backslash -> 反斜杠
- 各个语言的正则表达式引擎在细枝末节上有不同的实现
- Java 正则表达式匹配中使用
\需要转义"[aeiou\\]]" \n\s*\r- java.lang.String split 会将结尾的空白字符删除
- Java 中匹配一个
\=>\\\\=>\ === \\+ 匹配 ===\\ - 在 Java 中尽量少用或少编译 => 效率低