Java 正则表达式,正则表达式匹配a标签下的链接,正则表达式基础
編程環境
-
windows 10
-
eclipse
前言
??在一次Java程序設計課程中,在課堂上了解到了正則表達式,然后自己去百度了一番,發現正則表達式應用的范圍還是比較廣泛的,在Python爬蟲爬取數據時候,也會用上正則表達式,所以決定花點心思去學習一下正則表達式。
正則表達式語法
- 普通字符
| [123abc] | 匹配[…]括號里邊的所有字符,相當于匹配1或2或3或a或b或c, 等價于[1|2|3|a|b|c] |
| [^123abc] | 匹配除了[…]之外的所有字符,相當于匹配除了1,2,3,a,b,c之外的所有字符 |
| [a-z] | 表示一個區間,匹配小寫字母 |
| [A-Z] | 表示一個區間,匹配大寫字母 |
| [0-9] | 表示一個區間,匹配0到9之間的數字 |
| \d | 匹配數字,等價于[0-9] |
| \D | 匹配非數字,等價于[^0-9] |
| \w | 匹配字母、數字或者下劃線,等價于[a-zA-z0-9_] |
| \W | 匹配非字母、非數字或者非下劃線,\W相當于匹配\w的補集字符,等價于[^a-zA-z0-9_] |
說明:\大寫字母 和 \小寫字母,匹配的字符內容是相反的,^代表取反的意思
- 非打印字符
| \cx | 匹配由x指明的控制字符。例如, \cM 匹配一個 control-M 或回車符。x 的值必須是26個字母 |
| \f | 匹配一個換頁符 |
| \n | 匹配一個換行符 |
| \r | 匹配一個回車符 |
| \t | 匹配一個制表符 |
| \v | 匹配一個垂直制表符 |
| \s | 匹配所有的空白字符,等價于[\f\n\r\t\v] |
| \S | 匹配所有非空白字符,等價于[^\f\n\r\t\v] |
??說明:控制字符主要有LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BS(退格)、BEL(振鈴)等,存在于Ascii碼中的第0~31號及127號中。想了解更多關于控制字符的內容請點擊這里
- 特殊字符
| $ | 匹配輸入字符串的結尾位置,要匹配 $ 字符本身,請使用\$。 |
| ( ) | 標記一個子表達式的開始和結束位置,要匹配這些字符,請使用 \( 和 \) |
| * | 匹配前面的子表達式零次或多次,要匹配 * 字符,請使用 \* |
| + | 匹配前面的子表達式一次或多次,要匹配 + 字符,請使用 \+ |
| . | 匹配除換行符 \n 之外的任何單個字符,要匹配 . ,請使用 \. |
| [ | 標記一個中括號表達式的開始。要匹配 [ ,請使用 \[ |
| ? | 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符,要匹配 ? 字符,請使用 ? |
| \ | 將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉義符 |
| ^ | 匹配輸入字符串的開始位置,當該符號在方括號表達式中使用時,匹配非方括號內容的字符,相當于取反,要匹配 ^ 字符本身,請使用 ^ |
| { | 標記限定符表達式的開始,要匹配 {,請使用 \{ |
| | | 指明兩項之間的一個選擇,相當于或,要匹配 |,請使用 \ |
- 限定字符
| {n} | n 是一個非負整數,匹配確定的 n 次 |
| {n,} | n 是一個非負整數,至少匹配n 次 |
| {n,m} | m 和 n 均為非負整數,其中n <= m,最少匹配 n 次且最多匹配 m 次 |
正則表達式的應用
- 實例1
??我們來講一下比較有用的例子吧,拿html的標簽頁來舉例子,假如說我們需要匹配html中a標簽下的鏈接
import java.util.regex.Matcher; import java.util.regex.Pattern;public class Debug {public static void main(String[] args) {String html = "<a class=\"regex\" href=\"https://www.baidu.com/\">正則表達式</a>";String regex = "<a class=\"[a-z]+\" href=\"(.*?)\">(.*?)</a>";for (int i = 0; i < 3; i++) {String content = getContentByRegex(html, regex, i);System.out.println(content);}}public static String getContentByRegex(String html, String regex, int index) {String content = ""; // 如果沒有匹配到, 則返回空字符串Pattern pattern = Pattern.compile(regex);Matcher match = pattern.matcher(html);if (match.find()) {content = match.group(index);}return content;}}??解釋說明一下上面的代碼,html是我們獲取到的網頁源代碼,regex就是我們寫的正則表達式規則,可以看到的是,我在href=后邊使用了 .*? ,.*? 指的是匹配除了換行之外的所有字符,在這個代碼里邊就是匹配href后邊的整個鏈接(ps: .*? 在寫在href雙引號的里邊), .*? 我個人覺得是比較常用的一種,簡單好用。接下來就是調用自己寫的函數來返回匹配的內容,其中match.find()是必不可少的,match.group(0)或者match.group()代表的是正則表達式規則的全部內容,match.group(1)代表的是第一個括號里邊的內容,match.group(2)代表的是第二個括號里邊的內容,依次類推。
代碼的運行結果如下
<a class="regex" href="https://www.baidu.com/">正則表達式</a> https://www.baidu.com/ 正則表達式??如果我們只需要href里邊的鏈接,我們就只需要match.group(1)就可以了。
- 實例2
??那如果我們想匹配網頁上所有a標簽下的鏈接的話,該怎么做呢?先上代碼
import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.List; import java.util.ArrayList;public class Debug {public static void main(String[] args) {String html = "<a class=\"regex\" href=\"https://www.baidu.com/\">正則表達式\n</a>隔開兩個a標簽的內容\n<a class=\"regex\" href=\"https://blog.csdn.net/\">正則表達式\n</a>";String regex = "<a class=\"[a-z]+\" href=\"(.*?)\">(.*?)</a>"; // 正則表達式規則List<String> content = getContentByRegex(html, regex, 1); // 獲取到的內容System.out.println(content); // 輸出}public static List<String> getContentByRegex(String html, String regex, int index) {List<String> list = new ArrayList<>(); // 創建一個空列表Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);Matcher match = pattern.matcher(html);while (match.find()) {list.add(match.group(index));}return list;}}??解釋說明:因為我們需要匹配多個a標簽下的鏈接,所以我們用列表來存儲這些鏈接比較方便,對比上一個例子,會發現compile中多了一個Pattern.DOTALL, 原來 .*? 匹配的是除了換行之外的所有字符,使用DOTALL會把\n也當成一個普通字符,也就是說 .*? 也會匹配換行符;還有就是在getContentByRegex函數中用的是while (match.find()) 而不是if (match.find()),因為這里是有多個鏈接的,所有用的是while。
代碼的運行結果如下
[https://www.baidu.com/, https://blog.csdn.net/]我們來輸出一下match.group(2),輸出結果如下:
[正則表達式 , 正則表達式 ]會發現,也把 \n 符匹配了進去,所以輸出時候文字后邊會多了一個 \n ,這也就是使用DOTALL的原因,如果沒有使用DOTALL則會匹配失敗,返回的是空列表 [] 。
總結
??上述就是我對正則表達式的理解,講到的內容可能偏少,不過都是比較實用的東西。希望這篇文章會對你有幫助,如果有什么問題歡迎在評論區提出。
總結
以上是生活随笔為你收集整理的Java 正则表达式,正则表达式匹配a标签下的链接,正则表达式基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习之双线性插值(Bilinear
- 下一篇: 锋利的 jQuery 学习笔记