正則表示式及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 - 開啟擴充套件模式:在擴充套件模式中,將忽略表示式中的空白符和註釋符 '#' 後的內容 例如: (?x) \s+ ([[:graph:]]+) # first number \s+ ([[:graph:]]+) # second number 等同於 "\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"這個字串當中,第一個單詞應該被當作關鍵字識別,但是第二個不能。這