概述
正则表达式 => 用于描述文本 | 字符串的一组规则 => 处理文本 + 提取信息
转义字符
有的字符看不见,无法用一个键来表示。常见转义字符
-
\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/n
UNIX 换行符/n
- slash -> 斜杠
- backslash -> 反斜杠
- 各个语言的正则表达式引擎在细枝末节上有不同的实现
- Java 正则表达式匹配中使用
\
需要转义"[aeiou\\]]"
\n\s*\r
- java.lang.String split 会将结尾的空白字符删除
- Java 中匹配一个
\
=>\\\\
=>\ === \\
+ 匹配 ===\\
- 在 Java 中尽量少用或少编译 => 效率低
网友评论