Java?正則表達(dá)式URL?匹配與源碼全解析
在 Web 應(yīng)用開發(fā)中,我們經(jīng)常需要對 URL 進(jìn)行格式驗(yàn)證。今天我們結(jié)合 Java 的 Pattern
和 Matcher
類,深入理解正則表達(dá)式在實(shí)際應(yīng)用中的強(qiáng)大功能,并剖析一段實(shí)際的 Java 示例源碼。
package com.RegExpInfo; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Exercise02 { public static void main(String[] args) { // String content="https://"; // String content="http://"; // String content="https://" + // "www.bilibili.com/"; // String content="https://" + // "www.bilibili.com/" + // "video/" + // "BV1fh411y7R8?spm_id_from=333.788.player.switch&vd_" + // "source=6fe96db28441a84c79edc35a022cf1c5&p=895" ; // String content="https://" + // "www.bilibili.com" ; String content="https://blog.csdn.net/keshi12354?spm=1000.2115.3001.5343"; // String regExp="^((https|http)://)"; // (2) // String regExp="^((https|http)://)([\\w-]+\\.)+[\\w-]+\\/"; // (3) String regExp="^((https|http)://)([\\w-]+\\.)+[\\w-]+(\\/([\\w-_?=&./]*))?$"; // String regExp="^((https|http)://)([\\w-]+\\.)+[\\w-]+(\\/([\\w-_?=&./]*))?$"; Pattern pattern = Pattern.compile(regExp); Matcher matcher = pattern.matcher(content); while (matcher.find()) { System.out.println(matcher.group(0)); } } }
1.正則表達(dá)式分解:
分布實(shí)現(xiàn):
1. 基礎(chǔ)協(xié)議匹配 (1)
String regExp="^((https|http)://)";
功能:只匹配URL開頭的協(xié)議部分
匹配內(nèi)容:http://
或 https://
結(jié)構(gòu):
^
表示字符串開始
(https|http)
匹配"https"或"http"
://
匹配協(xié)議分隔符
目的:先確保能正確識(shí)別URL的協(xié)議部分
2. 添加域名匹配 (2)
String regExp="^((https|http)://)([\\w-]+\\.)+[\\w-]+\\/";
新增功能:在協(xié)議后添加域名和路徑的基本匹配
匹配內(nèi)容:如 http://example.com/
新增結(jié)構(gòu):
([\\w-]+\\.)+
匹配一個(gè)或多個(gè)域名部分(如"www."或"sub.")
\\w
匹配單詞字符(字母、數(shù)字、下劃線)
-
匹配連字符
+
表示一次或多次
\\.
匹配點(diǎn)號
[\\w-]+
匹配頂級域名(如"com")
\\/
匹配結(jié)尾的斜杠
目的:擴(kuò)展匹配完整的域名結(jié)構(gòu)
3. 添加路徑和查詢參數(shù)匹配 (3)
String regExp="^((https|http)://)([\\w-]+\\.)+[\\w-]+(\\/([\\w-_?=&./]*))?$";
新增功能:支持可選的路徑和查詢參數(shù)
匹配內(nèi)容:如 http://example.com/path?param=value
新增結(jié)構(gòu):
(\\/([\\w-_?=&./]*))?
\\/
匹配路徑開始的斜杠
[\\w-_?=&./]*
匹配路徑和查詢參數(shù)
包含字母、數(shù)字、下劃線、連字符、問號、等號、&、點(diǎn)和斜杠
?
表示整個(gè)路徑部分是可選的
$
表示字符串結(jié)束
目的:使正則表達(dá)式能夠匹配帶路徑和參數(shù)的完整URL
4. 最終優(yōu)化版本
String regExp="^((https|http)://)?([\\w-]+\\.)+[\\w-]+(\\/([\\w-_?=&./]*))?$";
關(guān)鍵改進(jìn):使協(xié)議部分變?yōu)榭蛇x
匹配內(nèi)容:現(xiàn)在可以匹配:
帶協(xié)議的URL:http://example.com/path
不帶協(xié)議的URL:example.com/path
修改點(diǎn):
在協(xié)議部分 ((https|http)://)
后添加了 ?
使其變?yōu)榭蛇x
目的:提高正則表達(dá)式的靈活性,適應(yīng)更多使用場景
5.設(shè)計(jì)思想總結(jié)
漸進(jìn)式開發(fā):從簡單到復(fù)雜逐步構(gòu)建正則表達(dá)式
模塊化設(shè)計(jì):每個(gè)部分都有明確的功能劃分(協(xié)議、域名、路徑)
靈活性增強(qiáng):通過添加可選標(biāo)記(?
)使表達(dá)式更通用
邊界明確:始終使用^
和$
確保匹配整個(gè)字符串
字符集合理定義:使用[\w-]
等字符集準(zhǔn)確描述允許的字符
這種分步構(gòu)建的方法不僅使正則表達(dá)式更易于理解和維護(hù),也方便在開發(fā)過程中逐步測試每個(gè)部分的匹配效果。
到此這篇關(guān)于Java 正則表達(dá)式綜合實(shí)戰(zhàn):URL 匹配與源碼解析的文章就介紹到這了,更多相關(guān)java正則表達(dá)式URL 匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解基于Spring Data的領(lǐng)域事件發(fā)布
這篇文章主要介紹了詳解基于Spring Data的領(lǐng)域事件發(fā)布,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Mybatis結(jié)果集自動(dòng)映射的實(shí)例代碼
在使用Mybatis時(shí),有的時(shí)候我們可以不用定義resultMap,而是直接在<select>語句上指定resultType。這個(gè)時(shí)候其實(shí)就用到了Mybatis的結(jié)果集自動(dòng)映射,下面通過本文給大家分享Mybatis結(jié)果集自動(dòng)映射的實(shí)例代碼,一起看看吧2017-02-02自己動(dòng)手在Spring-Boot上加強(qiáng)國際化功能的示例
這篇文章主要介紹了自己動(dòng)手在Spring-Boot上加強(qiáng)國際化功能的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04JPA多條件復(fù)雜SQL動(dòng)態(tài)分頁查詢功能
這篇文章主要介紹了JPA多條件復(fù)雜SQL動(dòng)態(tài)分頁查詢功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明
這篇文章主要介紹了Java構(gòu)造器(構(gòu)造方法)與方法區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java中的Map集合根據(jù)key值排序的實(shí)現(xiàn)
本文主要介紹了Java中的Map集合如何根據(jù)key值排序,包含使用TreeMap和使用lambda表達(dá)式和Stream流兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03Java基礎(chǔ)高級綜合練習(xí)題撲克牌的創(chuàng)建
今天小編就為大家分享一篇關(guān)于Java基礎(chǔ)高級綜合練習(xí)題撲克牌的創(chuàng)建,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實(shí)現(xiàn)
本文主要介紹了springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07關(guān)于FastJson?long?溢出問題的小結(jié)
這篇文章主要介紹了關(guān)于FastJson?long?溢出問題的小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。2022-01-01