在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
Awesome article! Let's share another interesting case for the word boundary.
回覆刪除String str7 = new String("hello_world_");
Best reagdrs,
Ian
Hi Lan,
回覆刪除Thanks for your interesting case.
Matt.