基本介紹
首先我們需要了解的是正則表達(dá)式中的各種元字符的功能,主要分為以下幾種:
- 限定符
- 選擇匹配符
- 分組組合和反向引用符
- 特殊字符
- 字符匹配符
- 定位符
需要注意的是:在 Java正則表達(dá)式中,兩個(gè)斜杠 \\ 相當(dāng)于其它語言中的一個(gè)斜杠 \ 。
字符匹配符
符號(hào) | 含義 | 示例 | 解釋 |
---|---|---|---|
[ ] | 可以匹配的字符列表 | [abcjs] | a、b、c、j、s都可以匹配到 |
[^] | 不可以被匹配的字符列表 | [^abc] | a、b、c不可以被匹配 |
- | 連字符 | a-z | 可以匹配任意a到z的字母 |
. | 匹配除 \n 之外的任何字符 | a..b | 以a開頭b結(jié)尾的字符串,中包括任意兩個(gè)字符 |
\\d | 匹配單個(gè)數(shù)字字符 | \\d{3}(\\d)? | 匹配連續(xù)3個(gè)或4個(gè)數(shù)字的字符串 |
\\D | 匹配非數(shù)字字符 | \\D(\\d)* | 以單個(gè)非數(shù)字字符開頭,后面接任意個(gè)數(shù)字的字符串 |
\\w | 匹配單個(gè)數(shù)字、英文字符、下劃線 | \\d{3}\\w{4} | 以3個(gè)數(shù)字字符開頭的長(zhǎng)度為7的數(shù)字字母字符串 |
\\W | 匹配單個(gè)非數(shù)字、非英文字符、非下劃線 | \\W+\\d{2} | 以至少一個(gè)非數(shù)字字母字符開頭,兩個(gè)數(shù)字字符結(jié)尾的字符串 |
\\s | 匹配任何空白字符(空格,制表符等) | ||
\\S | 匹配任何非空白字符,和\s剛好相反 |
Java 正則表達(dá)式默認(rèn)是區(qū)分大小寫的,如何實(shí)現(xiàn)不區(qū)分大小寫?
(?i)abc??? | abc 都不區(qū)分大小寫 |
a(?i)bc | bc 不區(qū)分大小寫 |
a((?i)b)c | 只有 b不區(qū)分大小寫 |
Pattern.compile(regex,Pattern.CASE_INSENSITIVE) | 方法參數(shù)內(nèi)設(shè)置忽略大小寫 |
選擇匹配符
符號(hào) | 含義 | 示例 | 解釋 |
---|---|---|---|
| | 或者的意思 | ab|cd | 匹配ab或者cd |
用于在匹配時(shí)有選擇的降低匹配標(biāo)準(zhǔn)。?
限定符
用于指定其前面的字符和組合項(xiàng)連續(xù)出現(xiàn)多少次
符號(hào) | 含義 | 示例 | 說明 | 示例 |
---|---|---|---|---|
* | 重復(fù)0次或n次 | (abc)* | 以abc開頭的,子串只包含abc的字符串 | abc,abcabc |
+ | 重復(fù)1次或多次 | (abc)+ | 至少以1個(gè)abc開頭,子串只包含abc的字符串 | abc,abcabc |
? | 重復(fù)0次或1次 | (abc)? | 以abc開頭的字符串 | abc |
{n} | 限定只能出現(xiàn)n次 | [a-d]{3} | 由連續(xù)的 a、b、c、d組成的字符串中任意長(zhǎng)度為3子串 |
定位符
規(guī)定要匹配的字符在字符串中出現(xiàn)的位置,比如是在字符串開始還是在結(jié)束處。
符號(hào) | 含義 |
---|---|
^ | 開頭 |
$ | 結(jié)尾 |
\\b | 匹配目標(biāo)字符串的邊界,子串之間的空格 |
\B | 匹配字符的非邊界 |
這里主要演示一下 \\b 和 \\B :
public static void main(String[] args) {
String content = "我愛學(xué)習(xí) 學(xué)習(xí)不愛我 學(xué)習(xí)很快樂";
String regex = "學(xué)習(xí)\\B";
Pattern compile = Pattern.compile(regex);
Matcher matcher = compile.matcher(content);
while (matcher.find()){
System.out.println(matcher.group());
}
}
當(dāng)我們?cè)O(shè)置匹配語句為 \\b 的時(shí)候,輸出結(jié)果:
學(xué)習(xí)
當(dāng)我們?cè)O(shè)置匹配語句為 \\B 的時(shí)候,輸出結(jié)果:
學(xué)習(xí)
學(xué)習(xí)
可以看到,\\b?匹配的是子串"學(xué)習(xí)"后是空格的,而 \\B 剛好相反。
分組
捕獲分組
我們上一篇博客寫過分組的案例,也就是 group(0),group(1)這種,也叫做非命名捕獲。
這里主要介紹一種新的分組方法,叫做命名捕獲,也就是說我們可以自定義組的名字。相比較之前的哪一種,它既可以使用非命名捕獲(通過組號(hào)獲取匹配的子串),也可以通過自定義的名字來捕獲。
語法:<?<name><pattern>>?
其中,需要先寫一個(gè)問號(hào)?,<name>是我們對(duì)組的命名,不要太離譜就行;<pattern>是我們的正則表達(dá)式,和非命名捕獲是一樣的。
String content = "sajnj ax1122s sjnaj4529 s584";
String regex = "(?<group1>\\d\\d)(?<group2>\\d\\d)";
Pattern compile = Pattern.compile(regex);
Matcher matcher = compile.matcher(content);
while (matcher.find()){
System.out.println(matcher.group("group1"));
System.out.println(matcher.group("group2"));
}
非捕獲分組
????????Java正則表達(dá)式中的不捕獲匹配(Non-capturing Group)指的是使用括號(hào)來分組匹配,但不會(huì)將該分組的匹配結(jié)果保存到匹配結(jié)果中。這樣可以在正則表達(dá)式中使用括號(hào)進(jìn)行邏輯分組,但不會(huì)捕獲分組的內(nèi)容,從而減少內(nèi)存開銷并提高性能。
? ? ? ? 也就是說,雖然有括號(hào)但是不算是一個(gè)組,你使用組索引 matcher.group(n) 是獲取不到結(jié)果的。
String content = "industries industry";
Pattern pattern = Pattern.compile("industr(?:y|ies)");
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}
輸出:
industries
industry
?
常用分組構(gòu)造形式 | 說明 |
---|---|
(?:pattern) | 匹配 pattern 但不捕獲該匹配的子表達(dá)式,即它是一個(gè)非捕獲匹配,常用來代替我們的或( | )語句。 |
(?=pattern) | 它是一個(gè)非捕獲匹配(正向預(yù)查)。例如 "Windows (?=95|98|NT|2000)" 匹配 "Windows 2000"中的 "Windows",但不匹配 "Windows 3.1"中的 "Windows'。 "(?=95|98|NT|2000)":正向預(yù)查,用于確定在匹配 "Windows" 后面的字符串是 "95"、"98"、"NT" 或者 "2000"。它使用了豎線字符 "|" 來表示 "或" 的關(guān)系,即滿足其中一個(gè)條件即可。注意,這個(gè)預(yù)查不會(huì)消費(fèi)輸入字符串,也不會(huì)將 "95"、"98"、"NT" 或者 "2000" 匹配結(jié)果保存到匹配結(jié)果中。 |
(?!attern) | 它也是一個(gè)非捕獲匹配(負(fù)向預(yù)查)。假設(shè)有一個(gè)正則表達(dá)式 (?!abc),它表示匹配任意一個(gè)不以 "abc" 結(jié)尾的字符串。例如 "Windows (?=95|98|NT|2000)" 匹配 "Windows XP"中的 "Windows",但不匹配 "Windows 2000"中的 "Windows'。 |
正向預(yù)查?
String content = "My operating system is Windows 11,his operating system is Windows XP";
Pattern pattern = Pattern.compile("Windows (?=11|XP)");
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}
運(yùn)行結(jié)果:
Windows
Windows
????????調(diào)試正則表達(dá)式后,發(fā)現(xiàn) (?=pattern)這種非捕獲分組,它必須滿足括號(hào)后面的條件才能被匹配,但是比如"Windows (?=11|XP)",要被匹配到的只可能是 "Windows 11" 或者 "Windows XP",但是這里的"11"和"XP"不會(huì)被保存到結(jié)果。
負(fù)向預(yù)查
String content = "My operating system is Windows 11,his operating system is Windows XP";
Pattern pattern = Pattern.compile("Windows (?!8|9|10)");
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}
運(yùn)行結(jié)果:?文章來源:http://www.zghlxwxcb.cn/news/detail-641905.html
Windows
Windows
????????調(diào)試正則表達(dá)式后,發(fā)現(xiàn) (?!pattern)這種非捕獲分組,它必須滿足括號(hào)后面的條件才能被匹配,但是比如"Windows (?=11|XP)",要被匹配到的只可能是除了 "Windows 11" 和?"Windows XP"之外的其他"Windows xxxx"的字符串,而且這里的"xxxx"同樣不會(huì)被保存到結(jié)果。?文章來源地址http://www.zghlxwxcb.cn/news/detail-641905.html
到了這里,關(guān)于Java 正則表達(dá)式【基本語法】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!