Java 代码之正则表达式高级用法

1. 匹配模式

1. (?:pattern)

非获取匹配,匹配 pattern 但不获取匹配结果,不进行存储供以后使用。这在使用或字符(|)来组合一个模式的各个部分是很有用。
例如,industr(?:y|ies)就是一个比industry|industries更简略的表达式。

2. (?=pattern)

非获取匹配,正向肯定预查,在任何匹配 pattern 的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。
例如,Windows(?=95|98|NT|2000)能匹配Windows2000中的Windows,但不能匹配Windows3.1中的Windows。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

3. (?!pattern)

非获取匹配,正向否定预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。
例如Windows(?!95|98|NT|2000)能匹配Windows3.1中的Windows,但不能匹配Windows2000中的Windows

4. (?<=pattern)

非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。
例如,(?<=95|98|NT|2000)Windows能匹配2000Windows中的Windows,但不能匹配3.1Windows中的Windows

5. (?<!pattern)

非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。
例如,(?<!95|98|NT|2000)Windows能匹配3.1Windows中的Windows,但不能匹配2000Windows中的Windows

2. 边界 \b

1. \b

单词边界就是单词和符号之间的边界。这里:

  • 单词可以是中文字符、英文字符、数字
  • 符号可以是中文符号、英文符号、空格、制表符、换行
1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test() {
String str = "(中文问号?123???英文)问号?我是华丽[的制表符\t]我是华丽{的空格符 我是华丽}的换行符\n";
String rex = "\\b";
Pattern pattern = Pattern.compile(rex);
String[] result = pattern.split(str);

for (String string : result) {
System.out.println("分割的字符串:" + string);
}

}

\b不用来判断当前字符串是否符合某种规则,一般我们都用\b来进行获取

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test() {
String str = ",,,,呵呵,,,,";
String rex = "\\b呵呵\\b";

Pattern pattern = Pattern.compile(rex);
Matcher matcher = pattern.matcher(str);

if (matcher.find()) {
System.out.println(matcher.group()); // 呵呵
}
}

2. \B

\B=[^\b],是非单词边界,即是符号与符号,单词与单词的边界

1
2
3
4
5
6
7
8
9
10
@Test
public void test() {
String str = "123456我是JAVA{,、;‘asd";
String rex = "\\B";
Pattern pattern = Pattern.compile(rex);
String[] result = pattern.split(str);
for (String string : result) {
System.out.println("分割的字符串:" + string);
}
}

\B一般也是用来获取字符串的

1
2
3
4
5
6
7
8
9
10
@Test
public void test07() {
String str = ",,,,,和呵呵,,,,,";
String rex = "\\B呵\\B";
Pattern pattern = Pattern.compile(rex);
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
System.out.println(matcher.group());
}
}