Regex :
- 本文介绍最基本的正则匹配规则
- 本文的正则表达式在 Java 中测试
Java 的 java.util.regex.Pattern 类和 java.util.regex.Matcher 类的基本用法
Pattern 类有一个静态方法 static boolean Pattern.matches(String regex, CharSequence input) 可以用来测试一个正则表达式与某串字符是否匹配;用 Pattern类的静态工厂方法 static Pattern compile(String regex) 可以产生一个 Pattern 对象,这个对象的成员方法 Matcher matcher(CharSequence input) 返回依赖于当前 Pattern 的一个 Matcher 对象,这个 Matcher 对象可以执行一些成员方法,如 find() 来查找符合它所依赖的 Pattern 对象编译好的正则表达式规则的字符串。Sample:
利用 Matcher 对象 :1: Pattern pattern = Pattern.compile("<正则表达式>");2: Matcher matcher = pattern.matcher("<待匹配的字符序列>");3:
4: while (matcher.find()) { // find() 方法寻找下一个符合的字符串,寻找完毕返回 false5: System.out.println(matcher.group()); // 获取最后一个 find() 到的字符串6: }
利用 Pattern.matches() 方法:1: System.out.println(Pattern.matches("<正则表达式>", "<带匹配的字符串>")); // 匹配返回 true, 否则 false
其实还可以使用 String 类的成员方法 split 来做正则表达式的验证:
利用 String.split() 方法:1: String source = "<待匹配的字符串>";2: Sting[] result = source.split("<正则表达式>"); //把匹配到的字符串存放在一个数组里面返回3: foreach(String item : result) {
4: System.out.println(item);
5: }
言归正传:下面介绍某种规则书写的正则表达式与哪些字符串匹配
单个字符的匹配:
- x 匹配一个确定的字符
-
[…] 匹配 [ ] 中所代表字符序列中的某一个字符
- [aeiou] 匹配 a 或 e 或 i 或 o 或 e
- [^aeiou] 匹配任意一个字符除了 a e i o u? (negation 取反)
- [a-e] 匹配 a 到 e 中的任意一个字符,相当于 [abcde] (range 范围)
- [a-eA-E] 匹配 a 到 e 中的任意一个字符或 A 到 E 中的任意一个字符
- [a-p[w-y]] 相当于 [a-pw-y] (union 合并)
- [a-f&&[debug]] 匹配的字符同时满足在 a-f 中且在 [debug] 中,即 (intersection 交叉)
- [a-z&&[^aeiou]] 匹配的字符同时满足在 a-z 中且不在 [aeiou]中,即 (substraction 减法)
- 其实只要把 && 理解为一个逻辑操作‘且’也蛮好理解的,对吧 : )。
-
转义字符
- \\? 代表一个斜杠? ‘\’
- \t? 代表一个制表符 tab键按出来的那个
- \n 代表一个换行符 new line
- \r? 代表一个回车符 carriage-return
- \a 代表一个警铃 alert bell
- \e 代表一个转义字符
- \On 八进制值为On的字符 (0 <= n <= 7)
- \Onn 八进制值为Onn的字符 (0 <= n <= 7)
- \Omnn 八进制值为Omnn的字符 (0 <= m <= 3, 0 <= n <= 7)
- \xhh 十六进制值为0xhh的字符
- \uhhhh 十六进制值为0xhhhh的字符
- \x{h…h} 十六进制值为0xh…h的字符 (Character.Min_CODE_POINT <= 0xh..h <= Character.MAX_CODE_POINT)
-
预定义字符
-
. 一个点代表任意字符 Note:不包括 \n,\r 等一些字符
System.out.println(Pattern.matches(".", "\n")); --> false
- \d 数字字符[0-9]
- \D 非数字字符 [^0-9], [^\d]
- \s 空白符 [\t\n\x0B\f\r]
- \S 非空白字符 [^\s]
-
\w 单词字符 [a-zA-Z_0-9] 包括一个 _ 哦
System.out.println(Pattern.matches("\\w", "_")); –> true这里之所以用两个斜杠是因为 \ 在字符串中需要用 \\ 定义,所以字符串中的 \\ 就代表一个上面所说的 \w 或者 \d 中的一个 \。
- \W 非单词字符 [^\w]
-
. 一个点代表任意字符 Note:不包括 \n,\r 等一些字符
多个字符的匹配:
-
XY 多个字符放在一起形成一个字符串,匹配的时候匹配整个字符串
System.out.println(Pattern.matches("ggicci", "ggicci")); --> true
-
X{n} X重复n次
System.out.println(Pattern.matches("g{2}ic{2}i", "ggicci")); --> true
- X{n,} X重复至少n次
-
X{n,m} X重复至少n次,至多m次
System.out.println(Pattern.matches("g{2,4}", "gggggg")); –> false
-
X? X出现1次或者什么也没有,即 “”
1: System.out.println(Pattern.matches("g?", "g")); --> true
2: System.out.println(Pattern.matches("g?", "")); --> true
3: System.out.println(Pattern.matches("g?", "gg")); --> false
-
X* X不出现或者出现多次
1: System.out.println(Pattern.matches("g*", "")); --> true
2: System.out.println(Pattern.matches("g*", "g")); --> true
3: System.out.println(Pattern.matches("g*", "ggg")); --> true
-
X+ X至少出现1次
1: System.out.println(Pattern.matches("g+", "")); --> false
2: System.out.println(Pattern.matches("g+", "g")); --> true
3: System.out.println(Pattern.matches("g+", "gggg")); --> true
后续章节会讨论到 Boundary Matchers(边界匹配符)、分支条件、(Capturing Group)捕获组、Greedy/Reluctant/Possessive Quantifiers(贪婪、勉强、独占三种量词模式)、零宽断言等。
End :
Author : Ggicci
Java 学习笔记整理,谢谢阅读,有误请指正!