- 字符串的匹配
- 字符串的查找
- 字符串的替换
初步认识正则表达式
1 | // p("abc".matches("...")); |
. * + ? 四个字符
” .” 匹配所有 但是不匹配换行符
” * ” 匹配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 | // p(" \n\r\t".matches("\\s{4}")); |
正则表达式的边界处理
^ 以什么开头
$ 以什么结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\z 输入的结尾1
2
3
4
5p("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
15Pattern 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 | Pattern p = Pattern.compile("[\\w]{3,5}"); |
替换操作 replacement
1 | Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE); |
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
6Pattern 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 | Pattern p = Pattern.compile("([0-9]{2})\\1"); |
数量词
1 | Greedy 数量词 (贪婪的) 尽可能的多匹配 |
特殊构造
…遇到在谈