1. 程式人生 > >正則表示式及java相關練習

正則表示式及java相關練習

大體來講,正則表示式的文法分為3種標準:BRE、ERE 和 ARE。其中 BER 和 ERE 屬於 POSIX 標準,ARE 則是由各家定義的擴充套件。

POSIX 正則表示式

  傳統上,POSIX 定義了兩種正則表示式語法, 即:基本正則表示式(BRE)和擴充套件正則表

  達式(ERE)。

  其中, BRE 定義的語法符號包括:

  .       - 匹配任意一個字元。

  []      - 字符集匹配,匹配方括號中定義的字符集之一。

  [^]     - 字符集否定匹配,匹配沒有在方括號中定義的字元。

  ^       - 匹配開始位置。

  $       - 匹配結束位置。

  \(\)    - 定義子表示式。

  \n      - 子表示式向前引用,n 為 1-9 之間的數字。 由於此功能已超出正則語義,需

            要在字串中回溯,因此需要使用 NFA 演算法進行匹配。

  *       - 任意次匹配(零次或多次匹配)。

  \{m,n\} - 至少 m 次,至多 n 次匹配;\{m\} 表示 m 次精確匹配;\{m,\} 表示至少 m

            次匹配。

  ERE 修改了 BRE 中的部分語法,並增加了以下語法符號:

  ?       - 最多一次匹配(零次或一次匹配)。

  +       - 至少一次匹配(一次或更多次匹配)。

  |       - 或運算,其左右運算元均可以為一個子表示式。

  同時,ERE 取消了子表示式 "()" 和 次數匹配 "{m,n}" 語法符號的轉義符引用語法,在

  使用這兩種語法符號時,不在需要新增轉義符。 與此同時, ERE 也取消了非正則語義的

  子表示式向前引用能力。

  BRE 和 ERE 共享同樣的 POSIX 字元類定義。同時,它們還支援字元類比較操作 "[. .]"

  和字元來等效體 "[= =]" 操作,但很少被使用。

  f / fr / wfr / bwfr 等工具預設使用 ERE 模式,同時支援以下 perl 風格的字元類:

        POSIX 類        perl類     描述

    ----------------------------------------------------------------------------

        [:alnum:]                     字母和數字

        [:alpha:]       \a         字母

        [:lower:]       \l         小寫字母

        [:upper:]       \u         大寫字母

        [:blank:]                  空白字元(空格和製表符)

        [:space:]       \s         所有空格符(比[:blank:]包含的範圍廣)

        [:cntrl:]                  不可列印的控制字元(退格、刪除、警鈴...)

        [:digit:]       \d         十進位制數字

        [:xdigit:]      \x         十六進位制數字

        [:graph:]                  可列印的非空白字元

        [:print:]       \p         可列印字元

        [:punct:]                  標點符號

  - 此外,還有以下特殊字元類:

        perl類    等效POSIX表示式   描述

    ----------------------------------------------------------------------------

        \o        [0-7]             八進位制數字

        \O        [^0-7]            非八進位制數字

        \w        [[:alnum:]_]      單詞構成字元

        \W        [^[:alnum:]_]     非單詞構成字元

        \A        [^[:alpha:]]      非字母

        \L        [^[:lower:]]      非小寫字母

        \U        [^[:upper:]]      非大寫字母

        \S      [^[:space:]]      非空格符

        \D        [^[:digit:]]      非數字

        \X        [^[:xdigit:]]     非十六進位制數字

        \P        [^[:print:]]      非可列印字元

  - 還可以使用以下特殊字元換碼序列:

        \r  -  回車

        \n  -  換行

        \b  -  退格

        \t  -  製表符

        \v  -  垂直製表符

        \"  -  雙引號

        \'  -  單引號

高階正則表示式

  除了 POSIX BRE 和 ERE 之外,libutilitis 還支援與TCL 8.2相容的高階正則表示式語

  法(ARE)。 通過為 stRegEx 引數增加字首 "***:" 就可以開啟 ARE 模式,這個字首覆

  蓋 bExtended 選項。基本上講,ARE 是 ERE 的超集。 它在 ERE 的基礎上進行了如下幾

  項擴充套件:

  1. 支援"懶惰匹配"(也叫"非貪婪匹配"或"最短匹配"):在 '?', '*', '+' 或 '{m,n}'

     後追加 '?' 符號就可以啟用最短匹配,使得該正則表示式子句在滿足條件的前提下匹

     配儘可能少的字元(預設是匹配儘可能多的字元)。例如:將 "a.*b" 作用於 "abab"

     時,將匹配整個串("abab"),若使用 "a.*?b",則將只匹配前兩個字元("ab")。

  2. 支援子表示式的向前引用匹配:在 stRegEx 中,可以使用 '\n' 向前引用曾經定義的

     子表示式。如:"(a.*)\1" 可匹配 "abcabc" 等。

  3. 無名子表示式:使用 "(?:表示式)" 的方式建立一個無名錶達式, 無名錶達式不返回

     到一個 '\n' 匹配。

  4. 向前預判:要命中匹配,必須向前滿足指定條件。 向前預判分為肯定預判和否定預判

     兩種。肯定預判的語法為:"(?=表示式)",例如:"bai.*(?=yang)" 匹配 "bai yang"

     中的前四個字元("bai "),但在匹配時保證字串在 "bai.*" 後必須包含 "yang".

     否定判斷的語法為:"(?!表示式)", 例如:"bai.*(?!yang)" 匹配 "bai shan" 的前

     四個字元,但在匹配是保證字串在 "bai.*" 後不出現 "yang"。

  5. 支援模式切換字首,在 "***:" 之後可以緊跟形如 "(?模式串)" 樣式的模式串,模式

     串影響其後表示式的語義和行為。模式串可以是一下字元的組合:

     b - 切換至 POSIX BRE 模式,覆蓋 bExtended 選項。

     e - 切換至 POSIX ERE 模式,覆蓋 bExtended 選項。

     q - 切換至文字字面匹配模式, 表示式中的字元都作為文字進行搜尋,取消一切正則

         語義。此模式將正則匹配退化為一次簡單字串查詢。"***=" 字首是其快捷表示

         方式,意即:"***=" 等同於 "***:(?q)"。

     c - 執行大小寫敏感的匹配,覆蓋 bNoCase 選項。

     i - 執行忽略大小寫的匹配,覆蓋 bNoCase 選項。

     n - 開啟行敏感的匹配:'^' 和 '$' 匹配行首和行尾;'.' 和否定集('[^...]')不

         匹配換行符。此功能等同於 'pw' 模式串。覆蓋 bNewLine 選項。

     m - 等同於 'n'。

     p - '^' 和 '$' 只匹配整個字串的首尾,不匹配行;'.' 和否定集不匹配換行符。

         覆蓋 bNewLine 選項。

     w - '^' 和 '$' 匹配行首和行尾;'.' 和否定集匹配換行符。覆蓋 bNewLine 選項。

     s - '^' 和 '$' 只匹配整個字串的首尾,不匹配行;'.' 和否定集匹配換行符。覆

         蓋 bNewLine 選項。ARE 狀態下預設使用此模式。

     x - 開啟擴充套件模式:在擴充套件模式中,將忽略表示式中的空白符和註釋符 '#' 後的內容

         例如:

         @[email protected]

                       (?x)

                       \s+ ([[:graph:]]+)      # first number

                       \s+ ([[:graph:]]+)      # second number

         @[email protected]

         等同於 "\s+([[:graph:]]+)\s+([[:graph:]]+)"。

     t - 關閉擴充套件模式,不忽略空白符和註釋符後的內容。ARE 狀態下預設使用此模式。

  6. 與 BRE/ERE 模式不同的 Perl 風格字元類換碼序列:

        perl類    等效POSIX表示式   描述

    ----------------------------------------------------------------------------

        \a        -                 響鈴字元

        \A        -                 不論當前模式如何,僅匹配整個串的最開頭

        \b        -                 退格字元 ('\x08')

        \B        -                 轉義字元本身 ('\\')

        \cX       -                 控制符-X (= X & 037)

        \d        [[:digit:]]       10 進位制數字 ('0' - '9')

        \D        [^[:digit:]]      非數字

        \e        -                 退出符 ('\x1B')

        \f        -                 換頁符 ('\x0C')

        \m        [[:<:]]           單詞開始位置

        \M        [[:>:]]           單詞結束位置

        \n        -                 換行符 ('\x0A')

        \r        -                 回車符 ('\x0D')

        \s        [[:space:]]       空白符

        \S        [^[:space:]]      非空白符

        \t        -                 製表符 ('\x09')

        \uX       -                 16 位 UNICODE 字元 (X∈[0000 .. FFFF])

        \UX       -                 32 位 UNICODE 字元 (X∈[00000000 .. FFFFFFFF])

        \v        -                 縱向製表符 ('\x0B')

        \w        [[:alnum:]_]      組成單詞的字元

        \W        [^[:alnum:]_]     非單詞字元

        \xX       -                 8 位字元 (X∈[00 .. FF])

        \y        -                 單詞邊界(\m 或 \M)

        \Y        -                 非單詞邊界

        \Z        -                 不論當前模式如何,僅匹配整個串的最尾部

        \0        -                 NULL,空字元

        \X        -                 子表示式向前引用 (X∈[1 .. 9])

        \XX       -                 子表示式向前引用或 8 進製表示的 8 字元

        \XXX      -                 子表示式向前引用或 8 進製表示的 8 字元

 為了鞏固學習效果,特地找來了相關練習題(來自《自己動手寫網路爬蟲》一書)

例題1:查詢以Java開題,任意結尾的字元窗

                Pattern pattern = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("Java是一門程式語言");
boolean b =matcher.matches();
System.out.println(b);

例題2:以多個條件分割字元

              Pattern pattern2 = Pattern.compile("[ ,|]+");
      String[] str = pattern2.split("Java Hello World Java,Hello,,World|Sun");
      for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);}

例題3:文字替換,替換首次出現的正則表示式

             Pattern pattern = Pattern.compile("正則表示式");
         Matcher matcher = pattern.matcher("正則表示式 hello world, 正則表示式ZZZ");
         System.out.println(matcher.replaceFirst("Java")); 

例題4:文字替換,全部

             Pattern pattern = Pattern.compile("正則表示式");
          Matcher matcher = pattern.matcher("正則表示式 hello world, 正則表示式ZZZ");
          System.out.println(matcher.replaceAll("Java"));     

例題5:文字替換,置換字元

             Pattern pattern = Pattern.compile("正則表示式");
             Matcher matcher = pattern.matcher("正則表示式 hello world, 正則表示式ZZZ");
         StringBuffer sbr= new StringBuffer();
         while (matcher.find()) {
matcher.appendReplacement(sbr, "Java");
}
         matcher.appendTail(sbr);
         System.out.println(sbr.toString());  

例題6:驗證郵箱地址 

            String str = "[email protected]";
        Pattern pattern = Pattern.compile("[\\w\\.\\-][email protected]([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        System.out.println(matcher.matches());

例題7:去除HTML標記

            Pattern pattern = Pattern.compile("<.+?>",Pattern.DOTALL);
        Matcher matcher = pattern.matcher("<a href=\"index.html\"> 主頁</a>");
        String string = matcher.replaceAll("");
        System.out.println(string);

例題8:查詢HTML中對應的字串

             Pattern pattern = Pattern.compile("href=\"(.+?)\"");
             Matcher matcher = pattern.matcher("<a href=\"index.html\">主頁</a>");
             if (matcher.find()) {
System.out.println(matcher.group(1));
      }

例題9:擷取http//地址

            Pattern pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:]+");
        Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffddfd>fdf");
        StringBuffer buffer = new StringBuffer();
        while (matcher.find()) {
buffer.append(matcher.group());
buffer.append("\r\n");
 }
         System.out.println(buffer.toString());

例題10:使用矩陣陣列替換{}中的數字

         String str = "Java 目前的發展歷史是由{0}年-{1}年";
         String[][]object = {new String[]{"\\{0\\}","1995"},new String[]{"\\{1\\}","2007"}};
         System.out.println(replace(str,object));

         public static String replace(final String sourceString, Object[] object) {
String temp = sourceString;
for (int i = 0; i < object.length; i++) {
String[]result = (String[]) object[i];
Pattern pattern = Pattern.compile(result[0]);
Matcher matcher = pattern.matcher(temp);
temp=matcher.replaceAll(result[1]);
}
return temp;
}

相關推薦

表示式java相關練習

大體來講,正則表示式的文法分為3種標準:BRE、ERE 和 ARE。其中 BER 和 ERE 屬於 POSIX 標準,ARE 則是由各家定義的擴充套件。 POSIX 正則表示式   傳統上,POSIX 定義了兩種正則表示式語法, 即:基本正則表示式(BRE)和

python學習-表示式re模塊

我只 com 返回 現在 輸出 -1 完全匹配 group clu python中的所有正則表達式函數都在re模塊中。import re導入該模塊。 1,創建正則表達式對象 想re.compile()傳入一個字符串值,表示正則表達式,它將返回一個Regex模式對象。 創建一

表示式的學習和練習

正則表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。是用正則表示式來完成郵箱,賬號的驗證可以省去繁雜的邏輯,用更少的程式碼完成更復雜的事務。 通過學習我大致把當前學習的常見的字元分為四種: 1,預定義字元類 .:任何字元 \d : 數字[0-9]

劍指offer:表示式匹配(java)

/** * 題目:(正則表示式匹配) * 請實現一個函式用來匹配包括'.'和'*'的正則表示式。 * 模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 * 在本題中,匹配是指字串的所有字元匹配整個模

表示式(九)——練習

package com.wy.regular; public class RegularTest { public static void main(String[] args) { pri(

一些我經過驗證的-有效的-【表示式】-JAVA

在開發中,我們經常需要對引數做驗證。需要用到一些正則表示式。這裡我整理寫我驗證過的 正則表示式。 一: /** * <p>shang</p> * <p>判斷email格式是否正確</p> */ p

手機號表示式輸入的內容只能輸入漢字

//工具類 public class MobileCheckUtil { /** * 手機號正則表示式 * @param str * @return * @throws PatternSyntaxException

Shell表示式例項

一、Shell 正則表示式 基礎正則表示式:BRE 擴充套件正則表示式:ERE,擴充套件的表示式有+,?,|,(),grep選項-E . 匹配除換行符之外的任意單個字元 注意是單個字元,比如匹配1234,就應當是1…4,中間是兩個點

java 表示式java表示式匹配圖片個數

Java 正則表示式和 Perl 的是最為相似的。 java.util.regex 包主要包括以下三個類: 1、Pattern 類: pattern 物件是一個正則表示式的編譯表示。Pattern 類沒

表示式Date類

正則表示式:負責字串匹配處理(一般用在驗證字串格式)    ^正則表示式$字符集:[123456789]  表示123456789其中之一[^12345]     表示除了12345之外所有[1-5]        表示1-5的數[a-z]        表示a-z之間的字元

劍指Offer面試題53:表示式匹配 Java實現

/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0

表示式grep、sed、awk、cut、sort、uniq工具

1.正則表示式 (1)定義:規定一些特殊語法用來對字串進行模糊匹配; (2)特點: ①靈活性、邏輯性和功能性較強; ②可以迅速地用簡單的方式匹配字串; (3)使用事項:當正則表示式作為命令引數時,要用單引號括起來,

Python表示式match函式的用法

正則表示式(Regular Expression)是使用單個字串來描述、匹配一系列語法規則的字串。簡稱RE。 RE是爬蟲的基礎模組,可以用於驗證電話號碼,身份證號,郵箱,使用者名稱和密碼,url地址等。 操作步驟 呼叫re模組(python內嵌的包) i

表示式的簡單情況練習

在網頁中取出圖片網址: re.search(r"http.+?\.jpg",s).group() 提取域名前面的網址:s = https://blog.csdn.net/wangshuai33/article/details/82963081 re.sub(r"(http://.+?/)

C# 表示式常用表示式

匹配模式+環視(順序環視、逆序環視)+貪婪與非貪婪 RegexOptions.Multiline “^”匹配結果分析 在不開啟多行模式時,“^”只匹配字串的開始位置,也就是位置0。 在開啟了多行模式後,“^”匹配字串開始位置和每個“\n”之後的行起始位置。 “$”匹配結果分析 在不開啟多行模式時,如

Android 表示式應用

一、 正則表示式 (一)、概念:         正則表示式(regular expression)就是由普通字元(例如a到z)以及特殊字元(稱為元字元)組成的一種字串匹配的模式,可以用來檢查一個串是否含有某種子

表示式Java中的使用

這裡不打算說明正則表示式的具體細節,只講Java中使用正則表示式的一些基礎知識。 一個簡單的例子,使用正則表示式來匹配電話號碼,電話號碼包括了三到四位的區號;可有可無的連線符;6位到八位的電話號碼。正則表示式如下: \d{3,4}-?\d{6,9} 這裡僅僅是舉個例子,實際

利用Python+表示式處理java函式

目標: 提取java程式碼中的函式資訊(函式名、函式返回值、函式返回值型別、函式引數) 思路 1、匹配函式頭(public static void name()) 正常的函式頭都是 以public或private或protected開頭

python爬蟲學習筆記6:表示式re庫

正則表示式 語法 常用操作符 re庫 import re re庫的主要功能函式 re.search() re.search(pattern,string,f

表示式得到Java中所有的關鍵字

在一個Java應用程式中,我們可以用正則表示式可以得到所有的java關鍵字。那麼關鍵就是正確地使用詞邊界。例如:在"static staticField"這個字串當中,第一個單詞應該被當作關鍵字識別,但是第二個不能。這