天天看點

java比對規則

正規表達式的比對規則是從左到右按規則比對。我們首先來看如何使用正規表達式來做精确比對。

對于正規表達式​

​abc​

​來說,它隻能精确地比對字元串​

​"abc"​

​,不能比對​

​"ab"​

​,​

​"Abc"​

​,​

​"abcd"​

​等其他任何字元串。

如果正規表達式有特殊字元,那就需要用​

​\​

​轉義。例如,正規表達式​

​a\&c​

​,其中​

​\&​

​是用來比對特殊字元​

​&​

​的,它能精确比對字元串​

​"a&c"​

​,但不能比對​

​"ac"​

​、​

​"a-c"​

​、​

​"a&&c"​

​等。

要注意正規表達式在Java代碼中也是一個字元串,是以,對于正規表達式​

​a\&c​

​來說,對應的Java字元串是​

​"a\\&c"​

​,因為​

​\​

​也是Java字元串的轉義字元,兩個​

​\\​

​實際上表示的是一個​

​\​

​:

如果想比對非ASCII字元,例如中文,那就用​

​\u####​

​​的十六進制表示,例如:​

​a\u548cc​

​​比對字元串​

​"a和c"​

​​,中文字元​

​和​

​​的Unicode編碼是​

​548c​

​。

比對任意字元

精确比對實際上用處不大,因為我們直接用​

​String.equals()​

​就可以做到。大多數情況下,我們想要的比對規則更多的是模糊比對。我們可以用​

​.​

​比對一個任意字元。

例如,正規表達式​

​a.c​

​中間的​

​.​

​可以比對一個任意字元,例如,下面的字元串都可以被比對:

  • ​"abc"​

    ​,因為​

    ​.​

    ​可以比對字元​

    ​b​

    ​;
  • ​"a&c"​

    ​,因為​

    ​.​

    ​可以比對字元​

    ​&​

    ​;
  • ​"acc"​

    ​,因為​

    ​.​

    ​可以比對字元​

    ​c​

    ​。

但它不能比對​

​"ac"​

​、​

​"a&&c"​

​,因為​

​.​

​比對一個字元且僅限一個字元。

比對數字

用​

​.​

​可以比對任意字元,這個口子開得有點大。如果我們隻想比對​

​0​

​~​

​9​

​這樣的數字,可以用​

​\d​

​比對。例如,正規表達式​

​00\d​

​可以比對:

  • ​"007"​

    ​,因為​

    ​\d​

    ​可以比對字元​

    ​7​

    ​;
  • ​"008"​

    ​,因為​

    ​\d​

    ​可以比對字元​

    ​8​

    ​。

它不能比對​

​"00A"​

​,​

​"0077"​

​,因為​

​\d​

​僅限單個數字字元。

比對常用字元

用​

​\w​

​可以比對一個字母、數字或下劃線,w的意思是word。例如,​

​java\w​

​可以比對:

  • ​"javac"​

    ​,因為​

    ​\w​

    ​可以比對英文字元​

    ​c​

    ​;
  • ​"java9"​

    ​,因為​

    ​\w​

    ​可以比對數字字元​

    ​9​

    ​;。
  • ​"java_"​

    ​,因為​

    ​\w​

    ​可以比對下劃線​

    ​_​

    ​。

它不能比對​

​"java#"​

​,​

​"java "​

​,因為​

​\w​

​不能比對​

​#​

​、空格等字元。

比對空格字元

用​

​\s​

​可以比對一個空格字元,注意空格字元不但包括空格,還包括tab字元(在Java中用​

​\t​

​表示)。例如,​

​a\sc​

​可以比對:

  • ​"a c"​

    ​,因為​

    ​\s​

    ​可以比對空格字元;
  • ​"a c"​

    ​,因為​

    ​\s​

    ​可以比對tab字元​

    ​\t​

    ​。

它不能比對​

​"ac"​

​,​

​"abc"​

​等。

比對非數字

用​

​\d​

​可以比對一個數字,而​

​\D​

​則比對一個非數字。例如,​

​00\D​

​可以比對:

  • ​"00A"​

    ​,因為​

    ​\D​

    ​可以比對非數字字元​

    ​A​

    ​;
  • ​"00#"​

    ​,因為​

    ​\D​

    ​可以比對非數字字元​

    ​#​

    ​。

​00\d​

​可以比對的字元串​

​"007"​

​,​

​"008"​

​等,​

​00\D​

​是不能比對的。

類似的,​

​\W​

​可以比對​

​\w​

​不能比對的字元,​

​\S​

​可以比對​

​\s​

​不能比對的字元,這幾個正好是反着來的。

// regex      

​ Run

重複比對

我們用​

​\d​

​可以比對一個數字,例如,​

​A\d​

​可以比對​

​"A0"​

​,​

​"A1"​

​,如果要比對多個數字,比如​

​"A380"​

​,怎麼辦?

修飾符​

​*​

​可以比對任意個字元,包括0個字元。我們用​

​A\d*​

​可以比對:

  • ​A​

    ​:因為​

    ​\d*​

    ​可以比對0個數字;
  • ​A0​

    ​:因為​

    ​\d*​

    ​可以比對1個數字​

    ​0​

    ​;
  • ​A380​

    ​:因為​

    ​\d*​

    ​可以比對多個數字​

    ​380​

    ​。

修飾符​

​+​

​可以比對至少一個字元。我們用​

​A\d+​

​可以比對:

  • ​A0​

    ​:因為​

    ​\d+​

    ​可以比對1個數字​

    ​0​

    ​;
  • ​A380​

    ​:因為​

    ​\d+​

    ​可以比對多個數字​

    ​380​

    ​。
  • ​A​

    ​:因為​

    ​\d?​

    ​可以比對0個數字;
  • ​A0​

    ​:因為​

    ​\d?​

    ​可以比對1個數字​

    ​0​

    ​。