網頁

2017/8/24

Regex word boundary 單字邊界

在Java的Regex若要找出完整的單字,即該單字不為某個字裡面的字,可使用單字邊界符號(word boundary)\b

例如下面範例中的\\bworld\\b,前後設有單字邊界符號,因為str1的world是單獨一個字所以匹配,至於str2因為world在helloworld中,所以不匹配。

String regex = "\\bworld\\b";
Pattern pattern = Pattern.compile(regex);

String str1 = new String("hello world");
Matcher matcher1 = pattern.matcher(str1);
System.out.println(matcher1.find()); // true

String str2 = new String("helloworld");
Matcher matcher2 = pattern.matcher(str2);
System.out.println(matcher2.find()); // false

為什麼剛剛說是用\b但上面範例卻是\\b呢?因為反斜線(backslash)符號\在Java被用在為跳脫字(escape sequence),所以在Java中若要表示反斜線,就必須使用\\來表示。

而完整的單字是指,一段字串中的開頭的單字,最後的單字,還有前後被非文字的符號隔開的字,例如

String regex = "\\bworld\\b";
Pattern pattern = Pattern.compile(regex);

String str3 = new String("hello@world"); // 用@分隔,world為字串最後的單字
Matcher matcher3 = pattern.matcher(str3);
System.out.println(matcher3.find()); // true

String str4 = new String("hello$world#java"); // 用$及#分隔,world為中間的單字
Matcher matcher4 = pattern.matcher(str4);
System.out.println(matcher4.find()); // true

String str5 = new String("world order is a japenese band"); // world為字串開頭的單字
Matcher matcher5 = pattern.matcher(str5);
System.out.println(matcher5.find()); // true

String str6 = new String("hello世界world"); // 中文仍屬字,所以不是分隔單字的符號
Matcher matcher6 = pattern.matcher(str6);
System.out.println(matcher6.find()); // false

參考Word Boundaries

2 則留言:

  1. Awesome article! Let's share another interesting case for the word boundary.

    String str7 = new String("hello_world_");

    Best reagdrs,
    Ian

    回覆刪除
  2. Hi Lan,

    Thanks for your interesting case.

    Matt.

    回覆刪除