12.4 正则表达式
正则表达式由两种基本字符组成:
原义字符: e.g. a , b , \t , \n , …; 元字符:* + ? $ ^ ( ) [ ] { } 等等
文章目录
1.正则表达式分类
1.1字符集合类
- [abc] 将字符进行分类,可以与 [ ] 中的其中一个字符进行匹配
- [^abc] 对不是 [ ] 内的字符进行匹配(^:取反)
1.2范围类
- [a - z] 表示的是a - z 中的一个字符
注意:" - " 在 [ ] 内表示的是一个范围,而在 [ ] 外表示的是就是 " - " 本身
1.3预定义类
- 数字字符:
- \d == [0 - 9] 数字
- \D == [ ^0 - 9 ] 非数字
- 空白字符:
- [ \t \n \x0B \f \r ] == \s
- [ ^ \t \n \x0B \f \r ] == \S
- 单词字符:
- \w == [a - zA - Z0 - 9_]
- \W == [ ^a - zA - Z0 - 9_]
- 任何字符: . (与行结束符可能匹配也可能不匹配)
1.4边界字符
边界匹配:是位置,不是字符
- ^ : 行的开头
- $ : 行的结尾
- \b : 单词边界【单词与非单词之间的位置】(这里的单词包括:大小写字母,数字,_ ,中文)
- \B : 非单词边界【单词与单词之间,非单词与非单词之间的位置】
1.5量词
- ?:出现0次或者1次;
- +:出现一次或者多次;
- *:出现任意次;
- {m,n}:出现m到n次([m,n])
- {m, }:出现m次或以上
- { m } :出现正好m次
1.6分组
-
让一个Xxx,而不是单个X,进行{ 5 },这时就需要用()进行分组
System.out.println(s.replaceAll("(http)|(abc)|(java)", "X")); System.out.println(s.replaceAll("[(http)(abc)(java)]", "X")); //这是范围类,( 代指[ ]中其中的一个字符
1.6.1()的功能
-
改变正则表达式的优先级
-
分组,给每一个括号添加组名,方便后期通过组名来引用这段数据
-
作为子正则表达式【正则表达式的嵌套】使用
-
? : 忽略分组 表示可以改变优先级但是没有组号
-
反向引用:利用分组的编号进行反向引用。反向引用使用 $,必须先分组
// 将日期2018-04-27 转换成为 04/27/2018 // 2018-04-27 ==> 04/27/2018 String regex = "(\\d{4})-(\\d{2})-(\\d{2})"; String ss = "2018-04-27"; System.out.println("原日期字符串:" + ss); String replace = ss.replaceAll(regex, "$2/$3/$1");
-
1.7|或
- Hello|World|Java
2.正则表达式在Java当中的应用
-
字符串查找操作 Pattern和Matcher
String s = "xyyyz"; String regex = "x?y+z"; // 1.先将正则表达式编译成正则表达式对象 Pattern p = Pattern.compile(regex); // 2.通过正则表达式对象创建匹配器对象 Matcher m = p.matcher(s); //System.out.println(m); // 3.通过匹配器对象对字符串进行匹配 查找 替换 等操作 boolean matches2 = m.matches(); System.out.println(matches2);
find()和group()运用
//将Hello402World13Java798Android56PHP //字符串中的数字提取出来并且转化成一个排好序的字符串输出。例如 0123456789 public class HomeWork05 { public static void main(String[] args) { String s = "将Hello402World13Java798Android56PHP "; String regex = "\\d+"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(s); String ss = ""; while (m.find()) { ss += m.group(); } char[] chr = ss.toCharArray(); Arrays.sort(chr); //输出方法一: // ss = new String(chr); // System.out.println(ss); //输出方法二: System.out.println(String.valueOf(chr)); } }
-
字符串匹配操作 字符串的matches()方法 【完全匹配】
String s = "Hello.World_123.Good"; String regex = "\\w+"; System.out.println(s.matches(regex));
-
字符串替换操作 字符串的replaceAll()和replaceFirst()方法【部分匹配】
-
字符串分割 split() 方法
3.正则表达式的嵌套
public class RegexDemo {
public static void main(String[] args) {
String str = "Hello,World! in Andoid and java";
Pattern p = Pattern.compile("W(or)(ld!)");
Matcher matcher = p.matcher(str);
while (matcher.find()) {
System.out.println("Group 0: " + matcher.group());
// 默认以0组(整个字符串作为正则表达式)匹配 World!
System.out.println("Group 1: " + matcher.group(1));
// 使用第1组作为子正则表达式匹配 or
System.out.println("Group 2: " + matcher.group(2));
// 使用第2组作为子正则表达式匹配 ld!
System.out.println("Group 0: Start:" + matcher.start() + ",End: "+ matcher.end()); // [6,12)
System.out.println("Group 1: Start:" + matcher.start(1) + ",End: "+ matcher.end(1)); // [7,9)
System.out.println("Group 2: Start:" + matcher.start(2) + ",End: "+ matcher.end(2)); // [9,12)
}
}
}
4.动态拼接拼接正则表达式
public static TreeMap<String, WordInfo> getWordsCountInArticle(String article, String... words) {
// 定义容器,保存单词出现的次数
TreeMap<String, Integer> tm = new TreeMap<String, Integer>();
// 定义容器,保存文章中符合正则的单词
List<String> list = new ArrayList<String>();
// 定义容器,存储正则表达式字符串
StringBuilder sb = new StringBuilder();
// 动态拼接拼接正则表达式
sb.append("\\b("); // \\b(and|for)\\b
for (int i = 0; i < words.length; i++) {
if (i == words.length - 1) {
sb.append(words[i]);
} else {
sb.append(words[i]).append("|");
}
}
sb.append(")\\b");