正則表達(dá)式的元字符可以大致分為六類(lèi):
- 限定符
- 選擇匹配符
- 分組組合和反向引用符
- 特殊字符
- 字符匹配符
- 定位符
轉(zhuǎn)義符
\\
符號(hào)在檢索某些特殊字符的時(shí)候可以使用,否則檢索不到結(jié)果。
在Java中是\\
,而其他語(yǔ)言則是\
。
一般 . * + ( ) $ / \ ? [ ] { }
都可能需要轉(zhuǎn)義符
public static void main(String[] args) {
String content = "abc$((abfs)($(123";
// 正則表達(dá)式:匹配左括號(hào),需要用到轉(zhuǎn)義符
String regex = "\\(";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("截取到的字符串:" + matcher.group(0));
}
}
字符匹配符
符號(hào) | 描述 | 示例 | 解釋 |
---|---|---|---|
[] |
可接收的字符列表 | [efgh] |
匹配e、f、g、h中的任意1個(gè)字符 |
[^] |
不接收的字符列表 | [^abc] |
除了a、b、c以外的任意1個(gè)字符,包括數(shù)字和特殊符號(hào) |
- |
連續(xù)字符 | A-Z |
任意一個(gè)大寫(xiě)字母 |
. |
匹配除\n 以外的任何字符 |
a..b |
以a開(kāi)頭,b結(jié)尾,中間有兩個(gè)任意字符,長(zhǎng)度為4的字符串(aaab,asdb,a*+b) |
\\d |
匹配單個(gè)數(shù)字字符,相當(dāng)于[0-9]
|
\\d{3(\\d)? |
包含3個(gè)或4個(gè)數(shù)字的字符串(123,4528) |
\\D |
匹配單個(gè)非數(shù)字字符,相當(dāng)于[^0-9]
|
\\D(\\d*) |
非數(shù)字開(kāi)頭,之后任意個(gè)數(shù)字字符串(a,A528) |
\\w |
匹配單個(gè)數(shù)字、大小寫(xiě)字母、下劃線的字符,相當(dāng)于[0-9a-zA-Z]
|
\\d{3}\\w{4} |
3個(gè)數(shù)字開(kāi)頭長(zhǎng)度為7的數(shù)字字母字符串(235ads5,123412a) |
\\W |
匹配單個(gè)非數(shù)字、大小寫(xiě)字母、下劃線的字符,相當(dāng)于[^0-9a-zA-Z]
|
\\W+\\d{2} |
一個(gè)非數(shù)字字母開(kāi)頭,2個(gè)數(shù)字結(jié)尾的字符串(#35,$%dassd25) |
\\s |
匹配任何空白字符(空格、制表符等) | ||
\\S |
匹配任何非空白字符 |
大小寫(xiě)
Java正則表達(dá)式默認(rèn)是區(qū)分字母大小寫(xiě)的,(?i)
表示編譯標(biāo)記。
下面幾個(gè)示例實(shí)現(xiàn)不區(qū)分大小寫(xiě):
-
(?i)abc
:表示abc都不區(qū)分大小寫(xiě) -
a(?i)bc
:表示bc不區(qū)分大小寫(xiě) -
a((?i)b)c
:表示b不區(qū)分大小寫(xiě) -
Pattern.CASE_INSENSITIVE
:不區(qū)分大小寫(xiě)
public static void main(String[] args) {
String content = "a11c8abcABC _";
// 匹配任意一個(gè)小寫(xiě)字母
String regex1 = "[a-z]";
// 匹配任意一個(gè)大寫(xiě)字母
String regex2 = "[A-Z]";
// 匹配小寫(xiě)abc,必須是abc連起來(lái)才能匹配上
String regex3 = "abc";
// 匹配不區(qū)分大小寫(xiě)abc
Pattern pattern1 = Pattern.compile(regex3, Pattern.CASE_INSENSITIVE);
// 匹配不區(qū)分大小寫(xiě)abc
String regex4 = "(?i)abc";
// 匹配數(shù)字
String regex5 = "[0-9]";
String regex6 = "\\d";
// 匹配除小寫(xiě)字母其他所有字符
String regex7 = "[^a-z]";
// 匹配abcd中任意一個(gè)字符
String regex8 = "[abcd]";
// 匹配數(shù)字、字母、下劃線中任意一個(gè)字符
String regex9 = "\\w";
// 匹配空格、制表符
String regex10 = "\\s";
// 匹配除\n以外的所有字符,匹配.本身的話使用\\.
String regex = ".";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("截取到的字符串:" + matcher.group(0));
}
}
選擇匹配符
符號(hào) | 描述 |
---|---|
| |
匹配 | 前或后的表達(dá)式 |
public static void main(String[] args) {
String content = "a11c8abcABC _";
// 匹配abc或者ABC再或者aaa
String regex = "abc|ABC|aaa";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("截取到的字符串:" + matcher.group(0));
}
}
限定符
用于指定其前面的字符和組合項(xiàng)連續(xù)出現(xiàn)多少次。
符號(hào) | 描述 | 示例 | 解釋 |
---|---|---|---|
* |
指定字符重復(fù)0次或n次 | (abc)* |
僅包含任意個(gè)abc的字符串,等效于\w* (abc,abcabcabc) |
+ |
指定字符重復(fù)1次或n次(最少一次) | m+(abc)* |
m開(kāi)頭,后面接任意個(gè)abc的字符串(m,mabc,mabcabcabc) |
? |
指定字符重復(fù)0次或1次(最多一次) | m+abc? |
m開(kāi)頭,后面接ab或abc的字符串(mab,mabc,mmmabc) |
{n} |
只能輸入n個(gè)字符 | [abcd]{3} |
由abcd中字母組成長(zhǎng)度為3的字符串(abc,bcd,adc) |
{n,} |
指定至少n個(gè)匹配 | [abcd]{3,} |
由abcd中字母組成的任意長(zhǎng)度不小于3的字符串(aab,bdc,aaadbc) |
{n,m} |
指定至少n個(gè)但不多余m個(gè)匹配 | [abcd]{3,5} |
由abcd中字母組成的任意長(zhǎng)度不小于3的字符串,并且長(zhǎng)度不大于5的字符串(abc,abcd,aaaaa,bcdab) |
public static void main(String[] args) {
String content = "1111111aaaaaahello";
// 匹配aaa
String regex1 = "a{3}";
// 匹配1111,只會(huì)匹配(0,3),后面3個(gè)1不會(huì)被匹配到
String regex2 = "1{4}";
// 匹配兩位連續(xù)的數(shù)字,這里會(huì)匹配到3個(gè)11
String regex3 = "\\d{2}";
// 匹配aaa或者aaaa,Java中默認(rèn)會(huì)先匹配多的,因?yàn)橹挥?個(gè)a,所以是aaaa
String regex4 = "a{3,4}";
// 匹配連續(xù)2-5個(gè)數(shù)字的組合
String regex5 = "\\d{2,5}";
// 匹配一個(gè)1或者多個(gè)1,貪婪匹配,所以直接7個(gè)1
String regex6 = "1+";
// 匹配0個(gè)1或者多個(gè)1,貪婪匹配,所以直接7個(gè)1和一些沒(méi)有1
String regex7 = "1*";
// 匹配1后面有個(gè)a,也可以沒(méi)有
String regex = "1a?";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("截取到的字符串:" + matcher.group(0));
}
}
定位符
定位符規(guī)定要匹配的字符串出現(xiàn)的位置,比如在字符串開(kāi)始的位置或者結(jié)束的位置。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-832807.html
符號(hào) | 描述 | 示例 | 解釋 |
---|---|---|---|
^ |
指定起始字符 | ^[0-9]+[a-z]\* |
至少一個(gè)數(shù)字開(kāi)頭,后面接任意個(gè)小寫(xiě)字母(123,6aa,555edf) |
$ |
指定結(jié)束字符 | ^[0-9]\\-[a-z]+$ |
1個(gè)數(shù)字開(kāi)頭,接"-",接至少一個(gè)小寫(xiě)字母(1-a) |
\\b |
匹配目標(biāo)字符串的邊界 | hu\\b |
邊界指空格或者結(jié)束位置(huwenlong wlhu hahahu) |
\\B |
匹配目標(biāo)字符串的非邊界 | hu\\B |
和\\b相反(huwenlong wlhu hahahu) |
public static void main(String[] args) {
String content = "123abc";
// 匹配至少一個(gè)數(shù)字開(kāi)頭,后面接任意小寫(xiě)字母,匹配的是整串
String regex1 = "^[0-9]+[a-z]*";
// 匹配至少一個(gè)數(shù)字開(kāi)頭,必須一個(gè)小寫(xiě)字母結(jié)尾,匹配的是整串
String regex = "^[0-9]+[a-z]+$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("截取到的字符串:" + matcher.group(0));
}
}
public static void main(String[] args) {
String content = "huwenlong wlhu huhahahu";
// 匹配在邊界的hu,空格前的+字符串末尾的
String regex1 = "hu\\b";
// 匹配不在邊界的hu,空格后的+字符串開(kāi)頭的
String regex = "hu\\B";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("截取到的字符串:" + matcher.group(0));
}
}
分組
捕獲分組
常用分組構(gòu)造形式 | 描述 |
---|---|
(pattern) |
非命名捕獲,捕獲匹配的子字符串,編號(hào)為0的第一個(gè)捕獲是由整個(gè)正則表達(dá)式模式匹配的文本,其它捕獲的結(jié)果則根據(jù)左括號(hào)的順序從1開(kāi)始自動(dòng)編號(hào)。 |
(?<name>pattern) |
命名捕獲,將匹配的子字符串捕獲到一個(gè)組名稱(chēng)或2編號(hào)名稱(chēng)中,用于name的字符串不能包含任何符號(hào),并且不能以數(shù)字開(kāi)頭??梢允褂?code>''代替<> ,例如(?'name')
|
public static void main(String[] args) {
String content = "huwenlong wl7787 huhaha1541hu";
// 匹配四個(gè)數(shù)字
String regex1 = "\\d\\d\\d\\d";
// 非命名分組:
// 匹配四個(gè)數(shù)字,其中每?jī)蓚€(gè)數(shù)字為一組
// matcher.group(0):匹配到的所有字符串
// matcher.group(1):匹配到的第一組的內(nèi)容,也就是前兩個(gè)數(shù)字
// matcher.group(2):匹配到的第二組的內(nèi)容,也就是后兩個(gè)數(shù)字
String regex2 = "(\\d\\d)(\\d\\d)";
String regex = "(?<g1>\\d\\d)(?<g2>\\d\\d)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("截取到的字符串:" + matcher.group(0));
System.out.println("第一組:" + matcher.group(1));
System.out.println("第二組:" + matcher.group(2));
System.out.println("命名分組-第一組:" + matcher.group("g1"));
System.out.println("命名分組-第二組:" + matcher.group("g2"));
}
}
非捕獲分組
常用分組構(gòu)造形式 | 描述 |
---|---|
(?:pattern) |
非捕獲匹配,匹配pattern但不捕獲該匹配的子表達(dá)式,不存儲(chǔ)供以后使用的匹配。這對(duì)于用"or"字符(` |
(?=pattern) |
非捕獲匹配,例如:`'Windows (?=95 |
(?!pattern) |
非捕獲匹配,該表達(dá)式匹配不處于匹配pattern的字符串的起始點(diǎn)的搜索字符串。例如:`'Windows (?!95 |
public static void main(String[] args) {
String content = "hellohuwen arborhuwl huwonghello";
// 正常匹配
String regex1 = "huwen|huwl|huwong";
// 非捕獲分組,上面的等價(jià)于:
String regex2 = "huw(?:en|l|ong)";
// 非捕獲分組,huw后面包含了以下兩種情況才會(huì)被匹配,
// 但是不包含下面兩種字符,所以得到的結(jié)果是兩個(gè)huw
String regex3 = "huw(?=en|l)";
// 非捕獲分組,huw后面不包含以下兩種情況才會(huì)被匹配,
// 但是不包含下面兩種字符,所以得到的結(jié)果是一個(gè)huw
String regex = "huw(?!en|l)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("截取到的字符串:" + matcher.group(0));
}
}
非貪婪匹配
一般情況下,正則表達(dá)式會(huì)貪婪匹配,可以看限定符章節(jié),而在后面加個(gè)?
就是非貪婪匹配。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-832807.html
public static void main(String[] args) {
String content = "1111111aaaaaahello";
// 匹配數(shù)字,貪婪匹配會(huì)匹配到1111111
String regex1 = "\\d+";
// 匹配數(shù)字,非貪婪匹配會(huì)匹配到七個(gè)1
String regex = "\\d+?";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("截取到的字符串:" + matcher.group(0));
}
}
反向引用
-
分組: 用圓括號(hào)
()
組成一個(gè)比較復(fù)雜的匹配模式,一個(gè)圓括號(hào)就是一個(gè)子表達(dá)式(一個(gè)分組)。 - 捕獲: 把正則表達(dá)式中子表達(dá)式(分組)匹配的內(nèi)容,保存到內(nèi)存中,以數(shù)字編號(hào)或顯式命名的組里,方便后面引用。從左向右,以分組的左括號(hào)為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號(hào)為1,第二個(gè)為2,以此類(lèi)推,組0表示整個(gè)正則式。
- 反向引用: 小括號(hào)的內(nèi)容被捕獲后,可以在這個(gè)括號(hào)后被使用,從而寫(xiě)出一個(gè)比較實(shí)用的匹配模式。這種引用既可以在正則表達(dá)式的內(nèi)部,也可以在外部,內(nèi)部反向引用**\\分組號(hào)**,外部反向引用**$分組號(hào)**。
匹配兩個(gè)連續(xù)相同的數(shù)字:(\\d)\\1 // 先匹配一個(gè)數(shù)字,再反向引用一次,1表示分組1號(hào)也就是第一個(gè)括號(hào)
匹配五個(gè)連續(xù)相同的數(shù)字:(\\d)\\1{4} // 先匹配一個(gè)數(shù)字,再反向引用四次
匹配四個(gè)數(shù)字,中間兩個(gè)數(shù)相同,兩邊兩個(gè)數(shù)相同,例如:1221,3553,2332
(\\d)(\\d)\\2\\1 // \\2表示第二組反向引用一次,\\1表示第一組反向引用一次
示例
public static void main(String[] args) {
String content = "https://space.bilibili.com/124536558?spm_id_from=333.1007.0.0";
// 匹配多個(gè)漢字,整體匹配
String regex1 = "^[\u0391-\uffe5]+$";
// 匹配郵政編碼,1-9開(kāi)頭的六位數(shù)字
String regex2 = "^[1-9]\\d{5}$";
// 匹配QQ,1-9開(kāi)頭的5-10位數(shù)字
String regex3 = "^[1-9]\\d{4,9}$";
// 匹配手機(jī)號(hào)碼,必須是13 14 15 18開(kāi)頭的11位數(shù)字
String regex4 = "^1[3|4|5|8]\\d{9}$";
// 匹配url []中的 ? * . 表示的是本身,不是轉(zhuǎn)義符,所以不用使用\\轉(zhuǎn)義
String regex = "^((http|https)://)([\\w-]+\\.)+[\\w-]+(/[\\w-?=&/%.#]*)?$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
System.out.println("滿足格式");
} else {
System.out.println("不滿足格式");
}
}
到了這里,關(guān)于Java 正則表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!