日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 正则表达式,正则表达式匹配a标签下的链接,正则表达式基础

發布時間:2023/12/20 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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标签下的链接,正则表达式基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。