Regex :
- 本文介绍正则表达式中单词边界 \b 的使用
- 本文正则表达式在 Java 中测试
- 边界符有 \b, \B, ^, $, \A, \G, \Z, \z,本文只介绍 \b 的用法,其余的将在后期介绍
State :
首先单词字符在正则表达式中定义为 \w 也就是 [a-zA-Z_0-9],所谓的一个单词由1个或1个以上的单词字符组成,多个单词之间由非单词字符隔开。
\b 是一个位置匹配符,它有如下两种含义:
- 匹配字符串的首字符前和末字符后面的位置(前提是首字符、末字符是一个单词字符 \w)
- 在单词字符 \w 与非单词字符 \W 之间
Sample :
- differ 是一个单词
- ggicci_1991 是一个单词
- fuck! 不是一个单词(存在非单词字符!)
- 寻找字符串 I am ggicci and I’m powerful! 中的单词:
1: String source = "I am ggicci and I'm powerful!";
2: Pattern pattern = Pattern.compile("\\b\\w+\\b");
3: Matcher matcher = pattern.matcher(source);
4: while(matcher.find()) {
5: System.out.println(matcher.group());
6: }
7:
8: //输出:
9: I
10: am
11: ggicci
12: and
13: I
14: m
15: powerful
How 2 use ?
什么时候用到 \b 呢?
当我们需要匹配一整个单词的时候。举个例子,如果你要匹配 Ggicci 或者 ggicci 这样的用户名字,在一段字符串里面寻找这样的单词而不是像 ggicci_1991 这种,因为 ggicci_1991 也是单词,而我们不需要这种单词,而是完完整整的独立的 Ggicci 或者 ggicci 单词。 因为在我们用 [Gg]gicci 去匹配的时候,ggicci_1991 里面的 ggicci 也会被匹配出来,这个时候我们就需要用 \b 单词边界符去限定它。代码如下:
- 如果不用 \b 去限定,那么 ggicci_1991 中的 ggicci 也会被匹配到,虽然 ggicci_1991 才是一个独立的单词,而 ggicci 只是这个单词中的一部分:
1: String source = "Ggicci was born in 1991 and ggicci_1991 is an account.";
2: Pattern pattern = Pattern.compile("[Gg]gicci");
3: Matcher matcher = pattern.matcher(source);
4: while(matcher.find()) {
5: System.out.printf("Matched: %s Index: %d\n", matcher.group(), matcher.end());
6: }
1: //输出:
2: Matched: Ggicci Index: 6
3: Matched: ggicci Index: 34
- 用 \b 去限定,那么 ggicci_1991 中的 ggicci 将不会被匹配到,它只会匹配 Ggicci 或 ggicci 独立的单词:
1: String source = "Ggicci was born in 1991 and ggicci_1991 is an account.";
2: Pattern pattern = Pattern.compile("\\b[Gg]gicci\\b");
3: Matcher matcher = pattern.matcher(source);
4: while(matcher.find()) {
5: System.out.printf("Matched: %s Index: %d\n", matcher.group(), matcher.end());
6: }
1: //输出:
2: Matched: Ggicci Index: 6
-