ZhaoJiu's Studio.

JAVA SE 14 异常处理

字数统计: 1.3k阅读时长: 6 min
2019/04/21 Share

正则表达式是用来处理字符串,是处理字符串的利器。

用途:

  1. 字符串的匹配
  2. 字符串的查找
  3. 字符串的替换

初步认识正则表达式

1
2
3
4
5
6
//		p("abc".matches("..."));
// p("a8859bc".replaceAll("\\d", "-"));
// Pattern p = Pattern.compile("[a-z]{3}");
// Matcher m = p.matcher("abc");
// p(m.matches());
// p("abcd".matches("[a-z]{3}"));

. * + ? 四个字符

” .” 匹配所有 但是不匹配换行符

” * ” 匹配0次或多次

” + ” 匹配1次或多次

” ?” 匹配0次或1次

1
2
3
4
5
6
7
8
9
10
11
//		p("*".matches("."));
// p("".matches("."));
// p("3".matches("."));
// p("a".matches("."));
// p("aa".matches("aa"));
// p("aaaa".matches("a*"));
// p("aaaa".matches("a+"));
// p("aaaa".matches("a?"));
// p("".matches("a?"));
// p("".matches("a+"));
// p("".matches("a*"));

一个中括号只匹配一个字符

[abcd] 匹配adcd中任意一个字符

[^abcd] 匹配除了adcd中的其它字符

1
2
3
4
5
6
//		p("a".matches("[a-z]"));
// p("a".matches("[^a-z]"));
// p("a".matches("[a-zA-Z]"));
// p("a".matches("[a-z]|[A-Z]"));
// p("a".matches("[a-z[A-Z]]"));
// p("a".matches("[a-z&&[a]]"));

认识/s /w /d 大写的则是取反

/s 空白字符

/d 数字字符

/w 字母字符(包含0到9)

1
2
3
4
5
6
7
//		p(" \n\r\t".matches("\\s{4}"));
// p("".matches("\\S"));
// p("a_8".matches("\\w{3}"));
// p("$%^#&".matches("\\W{5}"));
// p("123".matches("\\d{3}"));
// p("adv".matches("\\D{3}"));
// p("\\".matches("\\\\"));

正则表达式的边界处理

^ 以什么开头

$ 以什么结尾

\b 单词边界

\B 非单词边界

\A 输入的开头

\G 上一个匹配的结尾

\z 输入的结尾

1
2
3
4
5
p("hello sir".matches("^h.*"));
p("hello sir".matches(".*sir$"));
p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));
p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
p("\n".matches("^[\\s&&[^\\n]]*\\n$"));

正则表达式的匹配方法

matches 整个输入序列与之匹配

find 方法扫描输入序列以查找一个与之匹配的子序列

lookingAt 尝试将输入序列从头开始与之匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Pattern p = Pattern.compile("[\\w]{3,5}");
String s = "adv-rwrrqweq-www-aaa";
Matcher m = p.matcher(s);
p(m.matches());
m.reset();
p(m.find());
p(m.find());
p(m.find());
p(m.find());
p(m.find());
p(m.lookingAt());
p(m.lookingAt());
p(m.lookingAt());
p(m.lookingAt());
p(m.lookingAt());

start方法和end方法 显示匹配字符串的匹配位置

1
2
3
4
5
6
7
8
9
10
11
12
13
Pattern p = Pattern.compile("[\\w]{3,5}");
String s = "adv-rwrrqweq-www-aaa";
Matcher m = p.matcher(s);
p(m.find());
p(m.start()+"-"+m.end());
p(m.find());
p(m.start()+"-"+m.end());
p(m.find());
p(m.start()+"-"+m.end());
p(m.find());
p(m.start()+"-"+m.end());
p(m.find());
p(m.start()+"-"+m.end());

替换操作 replacement

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
// "Java".matches("(?i)(java)");一样可以实现类似的效果 不区分大小写
Matcher m = p.matcher("Java JAVA jaVa jAva JAva YAOJavA zhangsaogan");
StringBuffer sb = new StringBuffer();
int i=0;
while (m.find()) {
i++;
if (i%2 == 0) {
m.appendReplacement(sb, "JAVA");
} else {
m.appendReplacement(sb, "java");
}
}
m.appendTail(sb);
p(sb);

Matcher方法:

appendReplacement(StringBuffer sb,String replacement)

实现非终端的添加和替换操作

appendTail(StringBuffer sb)

实现终端的添加和替换

Pattern方法:

compile(String regex,int flags)

flags的取值为:

CASE_INSENSITIVE 启用不区分大小写的匹配

MULTILINE 启用多行模式

DOTALL 表达式.可以匹配任何字符,包括行结束符

UNICODE_CASE 启用 Unicode 感知的大小写折叠。

CANON_EQ 规范等价,当且仅当其完整规范分解匹配时,两个字符才可视为匹配。

group分组:

用小括号括起来的内容既是一个分组,分组的顺序看左括号,第几个小括号就是第几个分组。

1
2
3
4
5
6
Pattern p = Pattern.compile("([\\d]{3,5})([\\w]{2,3})");
String s = "123ad-1234vbd-42312ww";
Matcher m = p.matcher(s);
while (m.find()) {
p(m.group(1));
}

back refenrences 组参考

1
2
3
4
Pattern p = Pattern.compile("([0-9]{2})\\1");
String s = "1212";
Matcher m = p.matcher(s);
System.out.println(m.matches());

数量词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Greedy 数量词 (贪婪的) 尽可能的多匹配
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次

Reluctant 数量词 (吝啬的) 尽可能少匹配
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次

Possessive 数量词 (所有的) 匹配全部
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次

特殊构造

…遇到在谈

CATALOG
  1. 1. 初步认识正则表达式
  2. 2. . * + ? 四个字符
  3. 3. 一个中括号只匹配一个字符
  4. 4. 认识/s /w /d 大写的则是取反
  5. 5. 正则表达式的边界处理
  6. 6. 正则表达式的匹配方法
  7. 7. start方法和end方法 显示匹配字符串的匹配位置
  8. 8. 替换操作 replacement
  9. 9. Matcher方法:
  10. 10. group分组:
  11. 11. back refenrences 组参考
  12. 12. 数量词
  13. 13. 特殊构造