Java —— 正則表達式

0. 注意

  • 正則表達式裏的點號(.),能夠匹配除換行符以外的全部字符
  • Java 語言同其餘語言中的正則表達式的不一樣在於:
    • 對 \(反斜線)的不一樣處理
      • \\:其餘語言中,表示在正則表達式中插入普通的反斜線(字面上的),不要賦予它任何的意義;
      • 而在 Java 中,\\:我要插入一個正則表達式的反斜線(構成正則式),其後的字符具備特殊的意義;
        • \\d:表示一位數字;
    • \\+⇒ 加號,\\.⇒ 點;
  • 提取單詞:\\W+(一個或多個字母)
  • 括號
    • 小括號:提取匹配的字符串,(\s*):匹配連續空格
      • (0-9) 匹配 0-9 自己,
      • [0-9]*:匹配數字,能夠爲空;
      • {1-9}:錯誤寫法;
    • 中括號:定義匹配的範圍,[a-zA-Z0-9] 相應位置匹配英文字符和數字,
      • [\s*]:表示匹配空格或星號;
    • 大括號,表示匹配的長度,\s{3}:匹配三個空格,\s[1, 3]:一到三個空格;

1. Java 中支持正則的類

  • Stringjava

    • str.matches(pattern):布爾判斷,返回 true、false;正則表達式

      • ’+911’.matches(‘(-|\+)?\d+’) ⇒ true,
      • ‘(-|\+)?\d+’ ⇒ 數字,以加號或者減號開頭,或者沒有任何符號;
      • 密碼中必須包含至少一個數字(\\w*\\d\\w*):
      password.matches("\\w*\\d\\w*")
  • StringBuffer函數

  • StringTokenizer

2. 定義模式,完成模式(pattern)的匹配(match)

  • java.lang.String ⇒ java(去掉字符和點)ui

    Pattern p = Pattern.compile("\\w+\\.");
    p.match(str).replaceAll("");
    • \W+:表示非單詞([^\w]\w: [a-zA-Z0-9]);

建立模式,進行匹配的步驟以下:spa

  • 使用 (static)Pattern.compile() 靜態方法編譯正則表達式,其會根據 String 類型的正則表達式生成一個 Pattern 對象,(Pattern 類是對 String 類在實現正則匹配等功能上的豐富與拓展)
  • 把你想要檢索的字符串傳入 Pattern 對象的 matcher() 方法,matcher() 方法會返回一個 Matcher 對象那個,其內有十分豐富的函數實現:日誌

    // 咱們實現對待檢索的字符串 abcabcabcdefabc 的 (abc){2,} 模式的匹配
    
    Pattern p = Pattern.compile("abcabcabcdefabc");
    Matcher m = Matcher.match("(abc){2,}");
    // 迭代器,遍歷和迭代進行
    while (m.find()) {
        System.out.println("Match \"" + m.group() + "\" at position "
            + m.start() + "-" + (m.end()-1));
    }

3. 對日誌文件的掃描解析

以下形式的日誌文件:code

String logData = "" +
            "58.27.82.161@02/10/2005\n" +
            "204.45.234.40@02/11/2005\n";

逐行掃描,分別將其中的時間和 ip 提取出來。orm

String pattern = "(\\d+[.]\\d+[.]\\d+[.]\\d+@)" + 
    "(\\d+{2}/\\d{2}/\\d{4})";
Scanner scanner = new Scanner(logData);     // 建立對日誌文件掃描的掃描器對象
while (scanner.hasNext(pattern)) {
    scanner.next(pattern);
    MatchResult m = scanner.match();
    String original = m.group(0);
    String ip = m.group(1);
    String date = m.group(2);
    System.out.format("%s: %s from %s\n", original, date, ip);
}
相關文章
相關標籤/搜索