1. 程式人生 > >詳解正則表示式中的\B和\b

詳解正則表示式中的\B和\b

對於正則表示式的中\B和\b 有些地方會出現弄不懂的情況

或許你看了下面這篇部落格 你就能夠對\B和\b認識加深了

根據檢視API可以知道 \B和\b都是邊界匹配符

這裡寫圖片描述

先說說\b這個單詞邊界吧!竟然想了解 首先必須清楚什麼叫單詞邊界!我們可以以\b為分割來探究一下

單詞邊界

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class matcher1 {
    public static void main(String[] args) {
      String str="(中文問號?123???英文)問號?我是華麗[的製表符\t]我是華麗{的空格符 我是華麗}的換行符\n"
; String rex="\\b"; Pattern pattern=Pattern.compile(rex); Matcher matcher=pattern.matcher(str); String [] result=pattern.split(str); for(String string:result){ System.out.println("分割的字串:"+"["+string+"]"); } } }

執行結果

分割的字串:[(]
分割的字串:[中文問號]
分割的字串:[?]
分割的字串:[123
] 分割的字串:[???] 分割的字串:[英文] 分割的字串:[)] 分割的字串:[問號] 分割的字串:[?] 分割的字串:[我是華麗] 分割的字串:[[] 分割的字串:[的製表符] 分割的字串:[ ]] 分割的字串:[我是華麗] 分割的字串:[{] 分割的字串:[的空格符] 分割的字串:[ ] 分割的字串:[我是華麗] 分割的字串:[}] 分割的字串:[的換行符] 分割的字串:[ ]

從這些分割的字串中我們可以知道單詞邊界就是單詞和符號之間的邊界

這裡的單詞可以是中文字元,英文字元,數字;符號可以是中文符號,英文符號,空格,製表符,換行

下面我們看一個例子

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public
class matcher1 { public static void main(String[] args) { String str=" 2 "; String rex="\\b2\\b"; Pattern pattern=Pattern.compile(rex); Matcher matcher=pattern.matcher(str); if(matcher.matches()){ System.out.println("匹配成功"); }else{ System.out.println("匹配不成功"); } } }

在沒有看上面分割的例子前估計很多人包括我都會認為這執行的結果是匹配成功

經過分割的例子後就知道了 空格並不是邊界 空格與數字2之間的那個才叫邊界 所以執行結果不言而喻 肯定是匹配不成功

當如果你這樣寫就執行出來就是匹配成功

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class matcher1 {
    public static void main(String[] args) {
      String str="2";
      String rex="\\b2\\b";

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

      if(matcher.matches()){
          System.out.println("匹配成功");
      }else{
          System.out.println("匹配不成功");
      }
    }
}

\b的用法

一般來說\b不用來判斷當前字串是否符合某種規則

一般我們都用\b來進行獲取

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class matcher1 {
    public static void main(String[] args) {
      String str=",,,,呵呵,,,,";
      String rex="\\b呵呵\\b";

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

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

執行結果

呵呵

\B的用法

瞭解了\b的用法 我們再來說說\B \B是非單詞邊界

也就說\B=[^\b]//符號^是非的意思

\b是單詞與符號的邊界 那非單詞與符號的邊界的其它都是\B

所以我們的猜想\B是符號與符號,單詞與單詞的邊界

當然猜想需要認證!下面我們寫一個例子來證明一個!

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class matcher1 {
    public static void main(String[] args) {
      String str="123456我是JAVA{,、;‘asd";
      String rex="\\B";

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

      String [] result=pattern.split(str);

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

執行結果

分割的字串:1
分割的字串:2
分割的字串:3
分割的字串:4
分割的字串:5
分割的字串:6
分割的字串:我
分割的字串:是
分割的字串:J
分割的字串:A
分割的字串:V
分割的字串:A{      //單詞與符號之間的邊界不算\B的邊界
分割的字串:,
分割的字串:、
分割的字串:;
分割的字串:‘a
分割的字串:s
分割的字串:d

事實證明\B作為非單詞邊界 確實是單詞與單詞,符號與符號之間的邊界

\B一般也是用來獲取字串的

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class matcher1 {
    public static void main(String[] args) {
      String str=",,,,,和呵呵,,,,,";
      String rex="\\B呵\\B";

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

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

    }
}

因為字元與字元之間的邊界

所以執行的結果是

END!!!!!!!!!!!!!!!