正則表達式學習總結 --- Java(一)

正則表達式學習總結 — Java(一)

瞭解正則表達式
  • 正則表達式是一種強大而靈活的文本處理工具。使用正則表達式,我們能夠以編程的方式,構造複雜的文本模式,並對輸入的字符串進行搜索。一旦找到了匹配這些模式的部分,你就能夠隨心所欲地對它們進行處理。初學正則表達式時,其語法是一個難點,但它確實是一種簡潔、動態的語言。正則表達式提供了一種完全通用的方式,能夠解決各種字符串處理相關的問題:匹配、編輯以及驗證

  • 很久之前,正則表達式就已經整合到標準Unix工具集之中,例如sek和awk,以及程序設計語言之中了,例如Python和Perl。而在Java中,字符串操作還主要集中於String、 StringBuffer和StringTokenizer類。與正則表達式相比較,它們只能提供相當簡單的功能

Java中的正則表達式
  • 一般來說,正則表達式就是以某種方式來描述字符串,因此你可以說:”如果一個字符串含有這些東西,那麼它就是我正在找的東西。” 例如,要找一個數字,它可能有一個負號在最前面,那你就寫一個負號加上一個問號:-?

  • 要描述一個整數,你可以說它有一位或多位阿拉伯數字。在正則表達式中,用 \d 表示一位數字。如果在其他語言中使用正則表達式,那你立刻就能發現Java對反斜線 \ 的不同處理。在其他語言中,\\ 表示“我想要在正則表達式中插入一個普通的(字面上的)反斜線,請不要給它任何特殊的含義。” 而在Java中,\\ 的意思是“我要插入一個正則表達式的反斜線,所以其後的字符具有特殊的含義。” 例如,如果你想表示一位數字,那麼正則表達式應該是 \\d 。如果你想插入一個普通的反斜線,則應該這樣 \\\\ 。不過換行和製表符之類的東西只需要使用反斜線:\n \t

  • 要表示“一個或者多個之前的表達式”,應該使用+。所以,如果要表示“可能有一個負號,後面跟着一位或者多位數字”,可以這樣:-?\\d+

String類中的正則工具
  • String類中內建了幾個正則表達式的工具,它們的功能雖然比較單一,但也經常在實際應用中派上用場,接下來就對String類中的正則表達式工具進行詳細說說明

  • Java中的String類內建了正則表達式的功能,利用該類是應用正則表達式的最簡單的途徑。例如,你可以檢查一個String是否匹配一個正則表達式:

public static void main(String[] args) {
    System.out.println("-1234".matches("-?\\d+"));
    System.out.println("5678".matches("-?\\d+"));
    System.out.println("+991".matches("-?\\d+"));
    System.out.println("+991".matches("(-|\\+)?\\d+"));
}
/*
輸出:
true
true
false
true
*/
  • 前兩個字符串滿足對應的正則表達式,匹配成功。第三個字符串開頭有一個 + ,它也是一個合法的整數,但與對應的正則表達式卻不匹配。因此,我們的正則表達式應該描述爲:“可能以一個加號或減號開頭”。在正則表達式中,括號有着將表達式分組的效果,而豎線 | 則表示或操作。例如,(-|\+)? 這個正則表達式表示字符串的起始字符可能是一個 - 或者 + ,也可能是二者都沒有(因爲後面跟着 ? 修飾符)。還有就是,因爲字符 + 在正則表達式中有特殊的意義,所以必須使用 \ 將其轉義,使之成爲表達式中的一個普通字符

  • String類還自帶了一個非常有用的正則表達式工具——split()方法,其功能是 “將字符串從正則表達式匹配的地方切開”

public static String knights =
        "Then, when you have found the shrubbery, you must " +
        "cut down the mightiest tree in the forest... " +
        "with... a herring!";

public static void split(String regex) {
    System.out.println(
            Arrays.toString(knights.split(regex))
    );
}

public static void main(String[] args) {
    split(" ");
    split("\\W+");
    split("n\\W+");
}
/*
輸出:
[Then,, when, you, have, found, the, shrubbery,, you, must, cut, down, the, mightiest, tree, in, the, forest..., with..., a, herring!]
[Then, when, you, have, found, the, shrubbery, you, must, cut, down, the, mightiest, tree, in, the, forest, with, a, herring]
[The, whe, you have found the shrubbery, you must cut dow, the mightiest tree i, the forest... with... a herring!]
*/
  • 先看主函數中的第一行代碼,這裏使用普通的字符作爲正則表達式,其中並不包括任何特殊的字符。因此第一個 split() 只是按照空格來劃分字符串。而在第二個和第三個 split() 中,都使用到了 \\W ,它的意思是非單詞字符(如果W變成小寫,即\\w,則表示一個單詞字符)。觀察第二行代碼的輸出,它將標點字符刪掉了。第三個 split() 表示,“字母 n 後面跟着一個或者多個非單詞字符”。可以看到,在原始字符中,與正則表達式匹配的部分,在最終結果中都被剔除了

  • String類自帶的最後一個正則表達式工具是 “替換” 。你可以只替換正則表達式第一個匹配的子串,或者是替換所有匹配的地方

public static String knights =
        "Then, when you have found the shrubbery, you must " +
        "cut down the mightiest tree in the forest... " +
        "with... a herring!";

public static void main(String[] args) {
    String s = knights;
    System.out.println(s.replaceFirst("f\\w+", "located"));
    System.out.println(s.replaceAll("shrubbery | tree | herring", "banana"));
}
/*
輸出:
Then, when you have located the shrubbery, you must cut down the mightiest tree in the forest... with... a herring!
Then, when you have found the shrubbery, you must cut down the mightiestbananain the forest... with... abanana!
*/
  • 第一個表達式要匹配的是,以字母 f 開頭,後面跟着一個或者多個字母(注意w是小寫的)。並且只替換掉第一個匹配的部分,所以 “found” 被替換成 “located” 。而第二個表達式要匹配的是三個單詞中的任何一個,因爲它們以豎線 “|” 分割,表示 “或” 操作,並且替換所有匹配的部分
未完待續
  • 到這裏就介紹完了正則表達式的大致概念以及String類中有關正則表達式的內建功能,僅僅如此嗎? No No No! String之外的正則表達式還有更豐富更強大的工具供你使用,主要就是 java.util.regex 包所提供的正則表達式工具,下一篇博客就開始進入 regex 包~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章