以前每次要用到正則表達式都會到處去找資料看看元字符、限定符有哪些苍糠,怎么去用叁丧。用的很不熟悉,于是特意花了一個晚上去好好學學岳瞭。寫這篇博客對學到知識做一個的總結(jié)拥娄,也給以后做個參考吧,畢竟如果不經(jīng)常用的話可能又會忘掉瞳筏。
正則在線測試工具
什么是正則表達式
正則表達式是用于進行文本匹配的工具条舔,就把正則表達式理解成一個字符串匹配規(guī)則,可以根據(jù)這個規(guī)則在文本中找到你想要的字符串部分乏矾。
接下來直接從元字符、字符轉(zhuǎn)義迁杨、重復(fù)钻心、字符類、反義铅协、分枝條件捷沸、分組、向后引用這些來做個小歸納狐史。
1 元字符(metacharacter)
元字符 | 說明 |
---|---|
. | 匹配除換行以外的任意字符 |
\d | 匹配數(shù)字 |
\s | 匹配空白符(空格符' '痒给、水平制表符'\t'说墨、垂直制表符'\v'、換行符'\n'苍柏、回車符'\r') |
\w | 匹配字母\數(shù)字\下劃線\漢字 |
\b | 匹配單詞的開始或結(jié)束 |
^ | 匹配字符串的開始 |
$ | 匹配字符串的結(jié)束 |
例子
- \bhongyu\w*\b 匹配以hongyu開頭的單詞尼斧。
- ^\d{5,12}$ 匹配一個含有5到12位數(shù)字的字符串。
2 字符轉(zhuǎn)義
當要匹配特殊字符本身時试吁,用\來取消特殊字符的特殊意義
字符 | 表示 |
---|---|
. | \. |
* | \* |
\ | \\ |
^ | \^ |
$ | \$ |
例子
- c:\\windows匹配c:\windows棺棵。
- hongdou \^ hongyu匹配hongdou ^ hongyu。
3 重復(fù)
代碼/語法 | 說明 |
---|---|
* | 重復(fù)零次或更多次 |
+ | 重復(fù)一次或更多次 |
? | 重復(fù)零次或一次 |
{n} | 重復(fù)n次 |
{n,} | 重復(fù)n次或更多次 |
{n,m} | 重復(fù)n到m次 |
例子
- hi \w+ 匹配以hi 開頭后面跟一個或多個字符的字符串熄捍。
- 134\d{8} 匹配以134開頭的11位數(shù)字的字符串烛恤。
4 字符類
- [aeiou] 匹配 任何一個元音字母 a,e,i,o,u
- [a-z0-9A-Z] 匹配任意一個a-z或0-9或A-Z的字符
5 反義
代碼/語法 | 說明 |
---|---|
\W | 匹配任意不是字母和數(shù)字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非數(shù)字的字符 |
\B | 匹配不是單詞開頭或結(jié)束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou這幾個字母以外的任意字符 |
6 分枝條件
就類似于或,比方說你想匹配兩種號碼的任意一種:一種是三位區(qū)號余耽,8位本地號(如010-12345678)缚柏,一種是4位區(qū)號,7位本地號(0376-2233445)碟贾”倚可以用 0\d{2}[- ]?\d{8}|0\d{3}[- ]?\d{7}
兩個條件用 | 隔開。使用分枝條件時缕陕,要注意各個條件的順序粱锐,如\d{5}|\d{5}-\d{4},那么就只會匹配5位的數(shù)字串(以及9位數(shù)字串的前5位)扛邑。原因是匹配分枝條件時怜浅,將會從左到右地測試每個條件,如果滿足了某個分枝的話蔬崩,就不會去再管其它的條件了恶座。
7 分組
前面提到的重復(fù)部分的例子都是針對于單個字符進行的,那么如果要重復(fù)多個字符時沥阳,就要用到分組了跨琳。
例子
- ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?):
((2[0-4]\d|25[0-5]|[01]?\d\d?).)這個整體(分組)重復(fù)三次({3}),這是匹配一個IP地址桐罕。
8 向后引用
當使用一個小括號制定子表達式后脉让,匹配到的文本希望在后面能用于匹配 ,默認的情況下功炮,每個分組會自動有一個組號溅潜,組號從左到右,以分組的左括號為標志薪伏,第一個出現(xiàn)的為1滚澜,第二個為2,以此類推嫁怀。后面要用的某族匹配的文本時设捐,用\組名借浊,如\1代表分組1匹配的文本。
代碼/語法 | 說明 |
---|---|
(exp) | 匹配exp萝招,并捕獲文本到自動命名的組里(及將捕獲的文本內(nèi)容記錄下來) |
(?<name>exp) | 匹配exp蚂斤,并捕獲文本到命名為name的組里(也可寫成?'name'exp) |
(?:exp) | 匹配exp,不捕獲匹配的文本即寒,也不給次分組分配組號 |
例子
- \b(\w+)\b\s+\1\b 匹配重復(fù)的單詞橡淆,如: ha ha, go go母赵。
- \b(?<Word>\w+)\b\s+\k<Word>\b逸爵。同1,這里自己定義了分組名Word
9 零寬斷言
像\b, ^ , $那樣用于指定一個位置凹嘲,這個位置要滿足何種條件(斷言)师倔,零寬斷言用于指定在某些內(nèi)容前面或者后面要滿足什么條件。零寬斷言有四種:零寬度正預(yù)測先行斷言(斷言位置的后面能匹配表達式exp)周蹭、零寬度正回顧后發(fā)斷言(斷言位置的前面能匹配表達式exp)趋艘、零寬度負預(yù)測先行斷言(斷言位置的后面不能匹配表達式exp)、零寬度負回顧后發(fā)斷言(斷言位置的前面不能匹配表達式exp)
代碼/語法 | 說明 |
---|---|
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面跟的不是exp的位置 |
(?<!exp) | 匹配前面不是exp的位置 |
例子
- \b\w+(?=ing\b)凶朗,匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分):I'm singing while you're dancing.時瓷胧,它會匹配sing和danc。
- (?<=\bre)\w+\b棚愤,匹配以re開頭的單詞的后半部分(除了re以外的部分):reading a book時搓萧,它會匹配ading。
- ((?<=\d)\d{3})+\b宛畦,用它對1234567890進行查找時結(jié)果是234567890瘸洛。
- \b\wq(?!u)\w\b ,包含后面不是字母u的字母q的單詞次和。
- (?<![a-z])\d{7}匹配前面不是小寫字母的七位數(shù)字反肋。
- (?<=<(\w+)>).*(?=</\1>)匹配不包含屬性的簡單HTML標簽內(nèi)里的內(nèi)容。
10 貪婪與懶惰
貪婪就是匹配盡可能多的字符踏施,懶惰就是匹配盡可能少的字符石蔗。例如對于字符串a(chǎn)babab,用a.b,將匹配到ababab畅形,這個就是 貪婪匹配抓督;用a.?,匹配到的就是ab束亏,這就是懶惰匹配。正則表達式通常的行為是進行貪婪匹配阵具,要將貪婪匹配轉(zhuǎn)換成懶惰匹配碍遍,只要在限定符后面加上問好?就行了定铜。以下是懶惰限定符
代碼/語法 | 說明 |
---|---|
*? | 重復(fù)任意次,但盡可能少重復(fù) |
+? | 重復(fù)1次或更多次怕敬,但盡可能少重復(fù) |
?? | 重復(fù)0次或1次揣炕,但盡可能少重復(fù) |
{n,m}? | 重復(fù)n到m次,但盡可能少重復(fù) |
{n,}? | 重復(fù)n次以上东跪,但盡可能少重復(fù) |
11 處理選項
名稱 | 說明 |
---|---|
IgnoreCase(忽略大小寫) | 匹配時不區(qū)分大小寫畸陡。 |
Multiline(多行模式) | 更改^和$的含義,使它們分別在任意一行的行首和行尾匹配虽填,而不僅僅在整個字符串的開頭和結(jié)尾匹配丁恭。(在此模式下,$的精確含意是:匹配\n之前的位置以及字符串結(jié)束前的位置.) |
Singleline(單行模式) | 更改.的含義,使它與每一個字符匹配(包括換行符\n)斋日。 |
IgnorePatternWhitespace(忽略空白) | 忽略表達式中的非轉(zhuǎn)義空白并啟用由#標記的注釋牲览。 |
ExplicitCapture(顯式捕獲) | 僅捕獲已被顯式命名的組。 |
需要注意的是多行模式和單行模式并不沖突恶守。
Java中使用正則表達式
- String的match方法
判斷字符串s是否匹配正則表達式reg : s.match(reg)//匹配返回false第献,否則返回true. - Pattern 類
import java.util.regex.*;
class RegexExample1{
public static void main(String args[]){
String content = " hongdou " +
"loves hongyu with all his heart and soul.";
String pattern = "hongdou.*love.*hongyu";
boolean isMatch = Pattern.matches(pattern, content);
System.out.println("hondou loves hongyu : " + isMatch);
}
}
- Matcher 類
import java.util.regex.*;
class RegexExample2{
public static void main(String args[]){
String content = " hongdou " +
"loves hongyu with all his heart and soul.";
String pattern = "\\b\\w+\\b"; //匹配單詞
Matcher matcher= Pattern.compile(pattern).match(content);
// 將所有符合正則表達式的子串打印
while(matcher.find()) {
System.out.println(matcher.group());
}
}
}