JAVA正則表達(dá)式的基本使用教程
正則表達(dá)式語法
最簡單的正則表達(dá)式就是字符串,比如hello world也是一個(gè)正則表達(dá)式,匹配"hello world"字符串。在這基礎(chǔ)上我們加入其他符號(hào)表示,以滿足我們匹配一定格式的字符串而不是與正則表達(dá)式一模一樣的字符串,這些符號(hào)可以大致分為[]、{}、(),而其他的一些符號(hào)(如.,+,*,\\d等等)其實(shí)都可以認(rèn)為是他們的簡寫形式。
[]
[]表示匹配一個(gè)在[]中包含的任一字符,如[abc]表示匹配a或者b或者c。
可以使用-來表示一個(gè)字符區(qū)間,[a-c]與[abc]是等效的;同時(shí)可以寫多個(gè)區(qū)間,也可以寫完區(qū)間后再加入字符,如[a-z0-9A]表示匹配a-z或者0-9或者A中的任一字符;
可以使用^來取補(bǔ)集,即[^a-c]表示匹配除了abc的其他任何字符、[^0-9]表示匹配除了數(shù)字的任何字符、[^a]表示匹配除了a的其他任何字符;
一些與[]等效的簡寫方法:
| 簡寫 | 意義 |
|---|---|
| . | 匹配除"\r\n"之外的任何單個(gè)字符。 |
| \d | 數(shù)字字符匹配。等效于 [0-9]。 |
| \D | 非數(shù)字字符匹配。等效于 [^0-9]。 |
| \s | 匹配任何空白字符,包括空格、制表符、換頁符等。與 [ \f\n\r\t\v] 等效。 |
| \S | 匹配任何非空白字符。與 [^ \f\n\r\t\v] 等效。 |
| \w | 匹配任何字類字符,包括下劃線。與[A-Za-z0-9_]等效。 |
| \W | 與任何非單詞字符匹配。與[^A-Za-z0-9_]等效。 |
另外,由于java中**\\** 表示其他語言的一個(gè)\,所以上面的在java中均需要寫成\\d、\\D等等。
{}
{}表示對(duì)其前面的字符或子表達(dá)式匹配的次數(shù)。
| 表達(dá)式 | 意義 |
|---|---|
| {n} | n 是非負(fù)整數(shù)。正好匹配 n 次。如o{2}匹配兩次o |
| {n,} | n 是非負(fù)整數(shù)。至少匹配 n 次。 |
| {n,m} | m 和 n 是非負(fù)整數(shù),其中 n <= m。匹配至少 n 次,至多 m 次。 |
| 表達(dá)式 | 意義 |
|---|---|
| * | 零次或多次匹配前面的字符或子表達(dá)式,等效于 {0,}。 |
| + | 一次或多次匹配前面的字符或子表達(dá)式, 等效于 {1,}。 |
| ? | 零次或一次匹配前面的字符或子表達(dá)式, 等效于 {0,1}。 |
()
()表示一個(gè)捕獲組,由此可以使用()來將一個(gè)表達(dá)式拆分為多個(gè)組,實(shí)現(xiàn)將一個(gè)字符串中需要的信息提取出來。在()中的一開始加入?<name>可以實(shí)現(xiàn)對(duì)組命名,從而更方便地提取信息。
如(?[A-Za-z]+)表示一個(gè)至少由一個(gè)字母組成的人名,在獲取匹配到的人名時(shí)只需要用matcher.group("name")即可得到匹配結(jié)果。
JAVA寫法
模板
String pattern = "[a-z]+";//正則表達(dá)式
Pattern r = Pattern.compile(pattern);//將表達(dá)式編譯
Matcher matcher = r.matcher(text);//將text字符串作為匹配的字符串
matcher.find();//匹配
value1 = matcher.group("value1");//提取信息
例子
描述
根據(jù)時(shí)間精度的不同,可能出現(xiàn)以下四種認(rèn)定為正確的郵件信息格式:
username@domain-yyyy-mm-dd
例:lethean@buaa.edu.cn-2020-12-02
username@domain-yyyy-mm-dd-hh
例:myname-lethean@buaa.edu.cn-2020-12-02-15
username@domain-yyyy-mm-dd-hh:mimi
例:Lethean@buaa.edu.cn-2020-12-02-15:01
username@domain-yyyy-mm-dd-hh:mimi:ss
例:myname--lethean@buaa.edu.cn-2020-12-20-15:01:20
其中
username@domain 為
郵件發(fā)送者的郵箱地址
username 為用戶名,domain 為域名
yyyy-mm-dd / yyyy-mm-dd-hh / yyyy-mm-dd-hh:mimi / yyyy-mm-dd-hh:mimi:ss 為
發(fā)送時(shí)間
‘y' 代表一位年份數(shù)字,‘m' 代表一位月份數(shù)字,‘d' 代表一位日期數(shù)字,‘h' 代表一位小時(shí)數(shù)字,‘mi' 代表一位分鐘數(shù)字,‘s' 代表一位秒數(shù)數(shù)字
username 為只包含大小寫字母、- 的長度不為零的字符串,對(duì)于大小寫不敏感。
domain 為只包含大小寫字母、數(shù)字、. 的長度不為零的字符串,對(duì)大小寫敏感。
寫法
String pattern = "(?<username>[A-Za-z-]+)@(?<domain>[A-Za-z0-9.]+)-(?<yyyy>\\d{4})-(?<mm>\\d{2})-(?<dd>\\d{2})(-)?(?<hh>\\d{2})?(:)?(?<mimi>\\d{2})?(:)?(?<ss>\\d{2})?";
String text = "myname--lethean@buaa.edu.cn-2020-12-20-15:01:20";
Pattern r = Pattern.compile(pattern);
Matcher matcher = r.matcher(text);
if (matcher.find()) {
System.out.println("username:"+matcher.group("username"));
System.out.println("domain:"+matcher.group("domain"));
System.out.println("yyyy:"+matcher.group("yyyy"));
System.out.println("mm:"+matcher.group("mm"));
System.out.println("dd:"+matcher.group("dd"));
System.out.println("hh:"+matcher.group("hh"));
System.out.println("mimi:"+matcher.group("mimi"));
System.out.println("ss:"+matcher.group("ss"));
}
將text換成4種格式的郵箱均可得到正確結(jié)果,不存在的(hh、mimi、ss可能不存在)則為null。
運(yùn)行結(jié)果如下:
username:myname--lethean
domain:buaa.edu.cn
yyyy:2020
mm:12
dd:20
hh:15
mimi:01
ss:20
如果以第3種格式輸入,即text為Lethean@buaa.edu.cn-2020-12-02-15:01時(shí),輸出如下:
username:Lethean
domain:buaa.edu.cn
yyyy:2020
mm:12
dd:02
hh:15
mimi:01
ss:null
ss因?yàn)樵谠摳袷街袥]有所以為空。
例子改
描述
郵件信息輸入格式改為:(ss:mimi:hh-)dd-mm-yyyy-username@domain-place
根據(jù)時(shí)間精度的不同,可能出現(xiàn)以下四種認(rèn)定為正確的郵件信息格式:
dd-mm-yyyy-username@domain-place
例:02-12-2020-abc@buaa.edu.cn-Wuhu
hh-dd-mm-yyyy-username@domain-place
例:03-02-12-2020-abc@buaa.edu.cn-wuhu
mimi:hh-dd-mm-yyyy-username@domain-place
例:00:03-02-12-2020-abc@buaa.edu.cn-Wuhu
ss:mimi:hh-dd-mm-yyyy-username@domain-place
例:01:00:03-02-12-2020-abc@buaa.edu.cn-wuhu
place 是新加的域,表示地點(diǎn),由英文字母組成,對(duì)大小寫敏感,即 Beijing 和 beijing 視為不一樣的地點(diǎn)
寫法
String pattern = "(((?<ss>\\d{2}):)?((?<mimi>\\d{2}):))?((?<hh>\\d{2})-)?(?<dd>\\d{2})-(?<mm>\\d{2})-(?<yyyy>\\d{4})-(?<username>[A-Za-z-]+)@(?<domain>[A-Za-z0-9.]+)-(?<place>[A-Za-z]+)";
String text = "01:11:03-02-12-2020-abc@buaa.edu.cn-wuhu";
Pattern r = Pattern.compile(pattern);
Matcher matcher = r.matcher(text);
if (matcher.find()) {
System.out.println("username:"+matcher.group("username"));
System.out.println("domain:"+matcher.group("domain"));
System.out.println("yyyy:"+matcher.group("yyyy"));
System.out.println("mm:"+matcher.group("mm"));
System.out.println("dd:"+matcher.group("dd"));
System.out.println("hh:"+matcher.group("hh"));
System.out.println("mimi:"+matcher.group("mimi"));
System.out.println("ss:"+matcher.group("ss"));
System.out.println("place:"+matcher.group("place"));
}
注意前面的(((?<ss>\\d{2}):)?((?<mimi>\\d{2}):))?必須為嵌套的形式,否則匹配時(shí)會(huì)出現(xiàn)把mimi匹配成ss的錯(cuò)誤(因?yàn)閮烧叩钠ヅ涓袷较嗤绕ヅ浣o了ss,但是嵌套之后就不會(huì)出現(xiàn)這種情況)。
運(yùn)行結(jié)果如下:
username:abc
domain:buaa.edu.cn
yyyy:2020
mm:12
dd:02
hh:03
mimi:11
ss:01
place:wuhu
如果將text改為11:03-02-12-2020-abc@buaa.edu.cn-wuhu,輸出如下,ss不匹配。
username:abc
domain:buaa.edu.cn
yyyy:2020
mm:12
dd:02
hh:03
mimi:11
ss:null
place:wuhu
總結(jié)
到此這篇關(guān)于JAVA正則表達(dá)式使用的文章就介紹到這了,更多相關(guān)JAVA正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
新手小白入門必學(xué)JAVA面向?qū)ο笾鄳B(tài)
說到多態(tài),一定離不開其它兩大特性:封裝和繼承,下面這篇文章主要給大家介紹了關(guān)于新手小白入門必學(xué)JAVA面向?qū)ο笾鄳B(tài)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
spring通過filter,Interceptor統(tǒng)一處理ResponseBody的返回值操作
這篇文章主要介紹了spring通過filter,Interceptor統(tǒng)一處理ResponseBody的返回值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java日期時(shí)間與正則表達(dá)式超詳細(xì)整理(適合新手入門)
如果使用得當(dāng),正則表達(dá)式是匹配各種模式的強(qiáng)大工具,下面這篇文章主要給大家介紹了關(guān)于Java日期時(shí)間與正則表達(dá)式超詳細(xì)整理的相關(guān)資料,本文非常適合新手入門,需要的朋友可以參考下2023-04-04
SpringBoot整合微信登錄功能的實(shí)現(xiàn)方案
今天通過本文給大家分享微信登錄與SpringBoot整合過程,微信掃描登錄實(shí)現(xiàn)代碼知道掃描后點(diǎn)擊登錄的全部過程,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10
教你快速搭建sona服務(wù)及idea使用sona的方法
Sonar 是一個(gè)用于代碼質(zhì)量管理的開放平臺(tái)。通過插件機(jī)制,Sonar 可以集成不同的測試工具,代碼分析工具,以及持續(xù)集成工具,本文給大家分享搭建sona服務(wù)及idea使用sona的方法,感興趣的朋友一起看看吧2021-06-06

