正则表达式
精确匹配
一一对应,但是特殊字符要用"/"转义
匹配中文字符(utf-8),用\u####十六进制编码
匹配任意字符
-
. : 匹配任意字符(仅限一个字符)
-
\d : 匹配一个数字(仅限一个字符)
-
\w : 匹配一个字母、数字或者下划线(不能匹配空格、#等特殊字符)
-
\s : 匹配空格字符(空格 与制表符\t)
-
\D : 匹配一个非数字
-
\W : 匹配非字母、数字、下划线
-
\S : 匹配非空格字符
重复匹配
- 修饰符 * : 可以匹配0或多个字符
如\d* 可以匹配0到多个数字
- 修饰符 + : 可以匹配至少一个字符
如\d* 可以匹配1个以上的数字
- 修饰符 ? : 可以匹配0或1个字符
如\d? 可以匹配0或1个数字
- 修饰符 {m,n} : 可以精确匹配m到n个字符
如\d{3,5} 可以匹配3到5个数字
如果没有上限{m,} 可以匹配至少m个字符
复杂匹配规则
- 匹配开头和结尾
- ^ : 表示开头
$ : 表示结尾
如^A\d{3}$ 可以匹配 A001、A380
- ^ : 表示开头
- 指定匹配范围
- […] : 指定匹配范围
[123456789] : 可以匹配1-9
[1-9] : 简写匹配1-9
匹配十六进制数:[0-9a-fA-F]- [^…] : 指定排除范围
[^1-9] : 可以排除1-9
- 或规则匹配
| : 链接两个正则规则,表示或关系1|9 可以匹配1也可以匹配9
分组匹配
- regex类的使用
第几个子串由括号()确定Pattern pattern = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})"); //用正则表达式获取patter对象 patter.matcher("010-12345678").matches();//判断是否符合样式 返回值为布尔类型 Matcher matcher = pattern.matcher("010-12345678");//获取matcher对象 if (matcher.matches()){ //判断是否匹配成功 String whole = matcher.group(0);//"010-12345678" 0表示匹配的整个字符串 String first = matcher.group(1);//"010" 1表示匹配的的第一个子串 String second = matcher.group(2);//"12345678" 2表示匹配的第二个子串 }
非贪婪匹配
- 正则表达式默认使用贪婪匹配:
任意一个规则,总是尽可能的多的往后匹配 - 修饰符 ? :
修饰后使用非贪婪匹配: 尽可能少的匹配
分割、搜索、替换
- 用spilt(正则字符串)分割字符串
s.split(正则字符串) 按正则匹配分割字符串 - 用正则字符串搜索字符串
//示例
public class Main {
public static void main(String[] args) {
String s = "the quick brown fox jumps over the lazy dog.";
Pattern p = Pattern.compile("\\wo\\w");
Matcher m = p.matcher(s);
while (m.find()) {
String sub = s.substring(m.start(), m.end());
System.out.println(sub);
}
}
}
- 用replaceAll(正则字符串,待替换的字符串)
//示例
public class Main {
public static void main(String[] args) {
String s = "The quick\t\t brown fox jumps over the lazy dog.";
String r = s.replaceAll("\\s+", " ");
System.out.println(r); // "The quick brown fox jumps over the lazy dog."
}
}
- 反向引用
如果我们要把搜索到的指定字符串按规则替换,比如前后各加一个xxxx,这个时候,使用replaceAll()的时候,我们传入的第二个参数可以使用$1、$2来反向引用匹配到的子串。
示例
public class Main {
public static void main(String[] args) {
String s = "the quick brown fox jumps over the lazy dog.";
String r = s.replaceAll("\\s([a-z]{4})\\s", " <b>$1</b> ");
System.out.println(r);
}
}
上述代码的运行结果是:
the quick brown fox jumps <b>over</b> the <b>lazy</b> dog.
它实际上把任何4字符单词的前后用<b>xxxx</b>
括起来。实现替换的关键就在于"<b>$1</b>
",它用匹配的分组子串([a-z]{4})
替换了$1
。