JAVA正則運算式的使用
正則運算式語法
最簡單的正則運算式就是字串,比如hello world也是一個正則運算式,匹配"hello world"字串,在這基礎上我們加入其他符號表示,以滿足我們匹配一定格式的字串而不是與正則運算式一模一樣的字串,這些符號可以大致分為[]、{}、(),而其他的一些符號(如.,+,*,\\d等等)其實都可以認為是他們的簡寫形式,
[]
[]表示匹配一個在[]中包含的任一字符,如[abc]表示匹配a或者b或者c,
-
可以使用
-來表示一個字符區間,[a-c]與[abc]是等效的;同時可以寫多個區間,也可以寫完區間后再加入字符,如[a-z0-9A]表示匹配a-z或者0-9或者A中的任一字符; -
可以使用
^來取補集,即[^a-c]表示匹配除了abc的其他任何字符、[^0-9]表示匹配除了數字的任何字符、[^a]表示匹配除了a的其他任何字符; -
一些與
[]等效的簡寫方法:
| 簡寫 | 意義 |
|---|---|
| . | 匹配除"\r\n"之外的任何單個字符, |
| \d | 數字字符匹配,等效于 [0-9], |
| \D | 非數字字符匹配,等效于 [^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中**\\** 表示其他語言的一個\,所以上面的在java中均需要寫成\\d、\\D等等,
{}
{}表示對其前面的字符或子運算式匹配的次數,
-
運算式 意義 {n} n 是非負整數,正好匹配 n 次,如o{2}匹配兩次o {n,} n 是非負整數,至少匹配 n 次, {n,m} m 和 n 是非負整數,其中 n <= m,匹配至少 n 次,至多 m 次, -
運算式 意義 * 零次或多次匹配前面的字符或子運算式,等效于 {0,}, + 一次或多次匹配前面的字符或子運算式, 等效于 {1,}, ? 零次或一次匹配前面的字符或子運算式, 等效于 {0,1},
()
()表示一個捕獲組,由此可以使用()來將一個運算式拆分為多個組,實作將一個字串中需要的資訊提取出來,在()中的一開始加入?<name>可以實作對組命名,從而更方便地提取資訊,
如(?[A-Za-z]+)表示一個至少由一個字母組成的人名,在獲取匹配到的人名時只需要用matcher.group("name")即可得到匹配結果,
JAVA寫法
模板
String pattern = "[a-z]+";//正則運算式
Pattern r = Pattern.compile(pattern);//將運算式編譯
Matcher matcher = r.matcher(text);//將text字串作為匹配的字串
matcher.find();//匹配
value1 = matcher.group("value1");//提取資訊
例子
描述
根據時間精度的不同,可能出現以下四種認定為正確的郵件資訊格式:
-
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 為
郵件發送者的郵箱地址
- username 為用戶名,domain 為域名
-
yyyy-mm-dd / yyyy-mm-dd-hh / yyyy-mm-dd-hh:mimi / yyyy-mm-dd-hh:mimi:ss 為
發送時間
- ‘y’ 代表一位年份數字,‘m’ 代表一位月份數字,‘d’ 代表一位日期數字,‘h’ 代表一位小時數字,‘mi’ 代表一位分鐘數字,‘s’ 代表一位秒數數字
-
username 為只包含大小寫字母、
-的長度不為零的字串,對于大小寫不敏感, -
domain 為只包含大小寫字母、數字、
.的長度不為零的字串,對大小寫敏感,
寫法
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種格式的郵箱均可得到正確結果,不存在的(hh、mimi、ss可能不存在)則為null,
運行結果如下:
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時,輸出如下:
username:Lethean
domain:buaa.edu.cn
yyyy:2020
mm:12
dd:02
hh:15
mimi:01
ss:null
ss因為在該格式中沒有所以為空,
例子改
描述
郵件資訊輸入格式改為:(ss:mimi:hh-)dd-mm-yyyy-username@domain-place
-
根據時間精度的不同,可能出現以下四種認定為正確的郵件資訊格式:
-
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 是新加的域,表示地點,由英文字母組成,對大小寫敏感,即 Beijing 和 beijing 視為不一樣的地點
寫法
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}):))?必須為嵌套的形式,否則匹配時會出現把mimi匹配成ss的錯誤(因為兩者的匹配格式相同,先匹配給了ss,但是嵌套之后就不會出現這種情況),
運行結果如下:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/265409.html
標籤:其他
上一篇:宏任務與微任務和事件回圈
