正则表达式
正则表达式
- java 标准库 java.util.regex 提供支持
匹配规则
- 任意字符
.
- 任意数字
\d
- 非数字
\D
- 常用字符(一个字母、数字或下划线)
\w
\W
反着来- 空格字符(空格、tab)
\s
\S
反着来- 重复匹配
- 任意个
*
- 至少一个
+
- 一个或者0个
?
- 精确n个
{n}
- m~n个
{m, n}
- 任意个
String re = "java\\d*"
"java08".matches(re);
复杂匹配规则
- 匹配开头和结尾
^
$
- 匹配指定范围
[…]
(列举)- [1-9]{6,7}匹配1-9的数字6-7个
- [0-9a-fA-F]匹配0-9字符,a-f字符,A-F字符
- 匹配6个十六进制数 [0-9a-fA-F]
- 排除指定范围
[^…]
- 或规则
|
- AB|CD|go 匹配AB或CD或go
- 括号
learn\\s(java|php|go)
分组匹配
-
分组匹配
(…)
-
就是把一小部分的匹配结果分组,例如电话
(\d{3,4})\-(\d{6,8})
前面为区号,后面为号码
-
步骤
-
引入regex包,用pattern对象匹配,匹配成功后返回Matcher对象,如果匹配成功,可以直接从Matcher.group(index)返回子串
Pattern p = Pattern.compile("\\d{3,4}\\-(\\d{7,8}"); Matcher m = p.matcher("010-12345678"); if (m.matches()){ String g1 = m.group(1); String g2 = m.group(2); } else { System.out.println("匹配失败"); }
- 注意这里第一个索引是1
-
-
-
Pattern
-
String.matches() 方法需要每次都编译一次pattern,所以可以创建一个Pattern对象,反复使用
class PatternDemo{ public static void main(String[] args) { // 利用分组匹配,从字符串"23:01:59"提取时、分、秒。 Pattern pattern = Pattern.compile("([0-2]\\d):([0-5]\\d):([0-5]\\d)"); Matcher matcher = pattern.matcher("23:01:59"); if (matcher.matches()){ System.out.println(matcher.group(1)); System.out.println(matcher.group(2)); System.out.println(matcher.group(3)); } } }
-
非贪婪匹配
-
匹配规则后面加个
?
就可以使匹配规则更少的匹配 -
注意 \d?? 两个问号的区别
搜索和替换
-
分割字符串
"a b c".split("\\s"); // ==> {"a","b","c"} "a b c".split("\\s"); // ==> {"a","b","","c"} "a b c".split("\\s+");
-
搜索字符串
Pattern pattern = Pattern.compile("\\wo\\w"); Matcher m = pattern.matcher(str); // 这里没有分组,所以必须调用find()方法 while (m.find()){ System.out.println(str.substring(m.start(), m.end())); }
-
替换字符串
- String.replaceAll() 这个在核心类字符串有写
-
反向引用
- 如果要在匹配到的字符串前后加东西,replaceAll的第二个参数可以使用
<b>$1</b>
,这种方式,$1
、$2
用来引用
- 如果要在匹配到的字符串前后加东西,replaceAll的第二个参数可以使用