轉(zhuǎn)自:https://blog.csdn.net/zengxiantao1994/article/details/77816972
正則表達(dá)式是一種特殊的字符串模式,用于匹配一組字符串,就好比用模具做產(chǎn)品,而正則就是這個模具,定義一種規(guī)則去匹配符合規(guī)則的字符。
首先预侯,從最簡單的匹配開始糜芳,假設(shè)你要搜索一個包含字符”cat”的字符串,搜索用的正則表達(dá)式就是”cat”。如果搜索對大小寫不敏感,單詞“catalog”、“Catherine”、“sophisticated”等都可以匹配。
正則表達(dá)式的基本符號
1.1句點(diǎn)符號
假設(shè)你要找出三個字母的單詞,并且這些單詞必須以字母”t”開頭,以字母”n”結(jié)束。則可以使用一個通配符——句點(diǎn)符號”.”。這樣,完整的表達(dá)式”t.n”啃奴,它可以匹配”tan”瘟则、”ten”、”tin”,還可以匹配”t。n”、”t%n”等。句點(diǎn)符號”.”:能匹配除"\n"之外的任何單個字符。要匹配包括'\n'在內(nèi)的任何字符觉壶,請使用像'[.\n]'的模式争剿。
1.2方括號
為了解決句點(diǎn)符號匹配范圍過于廣泛這一問題涩笤,可以使用方括號(”[]”)炒刁,里面指定可以匹配的單個字符城瞎,此時只有方括號里面指定的字符才參與匹配认然。也就是說毕骡,正則表達(dá)式“t[aeio]n”只匹配“tan”叙凡、“ten”新啼、“tin”和“ton”物舒。但“toon”不匹配涵叮。
1.3”或”符號
“|”操作符的基本意義就是“或”運(yùn)算舀瓢。要匹配“toon”堰怨,使用“t(a|e|i|o|oo)n”正則表達(dá)式抠藕。這里不能使用方擴(kuò)號颜说,因?yàn)榉嚼ㄌ栔辉试S匹配單個字符烹困;這里必須使用圓括號“()”酝锅。圓括號還可以用來分組稿蹲。例如设哗,'z|food'能匹配 "z" 或"food"澎粟。'(z|f)ood' 則匹配 "zood" 或"food"啸盏。
1.4表示匹配次數(shù)的符號
這些符號用來確定緊靠該符號左邊的符號出現(xiàn)的次數(shù):
符號 | 次數(shù) |
---|---|
* | 0次或者多次 |
+ | 1次或者多次 |
? | 0次或者1次 |
{n} | 恰好n次 |
{n, m} | 從n次到m次 |
例如:我們要在文本文件中搜索美國的社會安全號碼。這個號碼的格式是999-99-9999。用來匹配它的正則表達(dá)式圖所示饲鄙。在正則表達(dá)式中颤练,連字符(“-”)有著特殊的意義宇挫,它表示一個范圍橡疼,比如從0到9滔岳。因此趴俘,匹配社會安全號碼中的連字符號時疲憋,它的前面要加上一個轉(zhuǎn)義字符“\”。
^會匹配行或者字符串的起始位置元镀,有時還會匹配整個文檔的起始位置住闯。
$會匹配行或字符串的結(jié)尾雇寇。例如:”^this .+ regex”叁怪,只能匹配以”this”開頭,以及以”regex”結(jié)尾的字符串鸦难,空格也不能包括愚争。同時^符號稱為“否”符號。如果用在方括號內(nèi),^表示不想要匹配的字符筛武。例如,匹配除以字母”X”開頭的所有單詞:”[^X][a-z]+”谍失。
1.6圓括號和空白符號
假設(shè)要從格式為“June 26, 1951”的生日日期中提取出月份部分,用來匹配該日期的正則表達(dá)式如下:
為簡便起見,你可以使用一些為常見正則表達(dá)式創(chuàng)建的快捷符號绊含。
符號 | 等價的正則表達(dá)式 |
---|---|
\d | [0-9] |
\D | [^0-9] |
\w | [A-Z0-9] |
\W | [^A-Z0-9] |
\s | [\t\n\r\f] |
\S | [^\t\n\r\f] |
例如盈蛮,在前面社會安全號碼的例子中樊零,所有出現(xiàn)“[0-9]”的地方都可以使用“\d”。
前面說過了表示次數(shù)的符號,其實(shí)還可以在每個符號后面都再加一個”?”憨琳,變成懶惰限定符,即盡可能少的重復(fù)势似。
"?" :重復(fù)任意次杯拐,但盡可能少重復(fù)顶滩。 如 "acbacb" 正則 "a.?b"只會取到第一個"acb" 原本可以全部取到但加了限定符后仅醇,只會匹配盡可能少的字符,而"acbacb"最少字符的結(jié)果就是"acb"蛤吓。
"+?":重復(fù)1次或更多次会傲,但盡可能少重復(fù)艾岂,與上面一樣氓辣,只是至少要重復(fù)1次絮吵。
"??":重復(fù)0次或1次,但盡可能少重復(fù)。如"aaacb"正則"a.??b"只會取到最后的三個字符"acb"赏寇。
"{n,m}?":重復(fù)n到m次吉嫩,但盡可能少重復(fù)。如 "aaaaaaaa" 正則 "a{0, m}"因?yàn)樽钌偈?次所以取到結(jié)果為空嗅定。
"{n,}?":重復(fù)n次以上自娩,但盡可能少重復(fù)。如 "aaaaaaa" 正則 "a{1,}" 最少是1次所以取到結(jié)果為 "a"渠退。
1.9其他符號
"\b" :不會消耗任何字符只匹配一個位置忙迁,常用于匹配單詞邊界。如:想從字符串中"This is Regex"匹配單獨(dú)的單詞 "is" 正則就要寫成 "\bis\b"碎乃。 \b不會匹配is兩邊的字符姊扔,但它會識別is兩邊是否為單詞的邊界。
"\w":匹配字母梅誓,數(shù)字恰梢,下劃線。例如要匹配"a2345BCD__TTz"梗掰。正則:"\w+" 嵌言。
\:反斜線字符;
\0n:八進(jìn)制值的字符0n (0 <= n<= 7)及穗;
\0nn:八進(jìn)制值的字符0nn (0 <= n<= 7) 摧茴;
\0mnn:八進(jìn)制值的字符0mnn 0mnn (0 <= m <= 3, 0 <= n <= 7);
\xhh:十六進(jìn)制值的字符0xhh埂陆;
\uhhhh:十六進(jìn)制值的字符0xhhhh苛白。
\t:制表符('\u0009');\n:換行符('\u000A')猜惋;\r:回車符('\u000D')丸氛;\f:換頁符('\u000C');\a:響鈴符('\u0007')著摔;\e:轉(zhuǎn)義符('\u001B');\cx T:對應(yīng)于x的控制字符x定续。
字符類 :[abc]:a, b, or c (簡單類) 谍咆;[^abc]:除了a、b或c之外的任意字符(求反)私股;[a-zA-Z]:a到z或A到Z摹察,包含(范圍);[a-z-[bc]]:a到z倡鲸,除了b和c供嚎;[a-z-[m-p]]:a到z,除了m到 p;[a-z-[^def]]:d, e, 或 f克滴。
捕獲分組
先了解在正則中捕獲分組的概念逼争,其實(shí)就是一個括號內(nèi)的內(nèi)容如 "(\d)\d" 而"(\d)" 這就是一個捕獲分組,可以對捕獲分組進(jìn)行后向引用 (如果后而有相同的內(nèi)容則可以直接引用前面定義的捕獲組劝赔,以簡化表達(dá)式) 如(\d)\d\1 這里的"\1"就是對"(\d)"的后向引用誓焦。
"(exp)":匹配exp,并捕獲文本到自動命名的組里着帽。
"(?<name>exp)":匹配exp杂伟,并捕獲文本到名稱為name的組里。
"(?:exp)":匹配exp仍翰,不捕獲匹配的文本赫粥,也不給此分組分配組號。
以下為零寬斷言:
"(?=exp)":匹配exp前面的位置予借。如 "How areyou doing" 正則"(?<txt>.+(?=ing))" 這里取ing前所有的字符傅是,并定義了一個捕獲分組名字為"txt" 而"txt"這個組里的值為 "How are you do"。
"(?<=exp)":匹配exp后面的位置蕾羊。如 "How areyou doing" 正則"(?<txt>(?<=How).+)" 這里取"How"之后所有的字符喧笔,并定義了一個捕獲分組名字為"txt" 而"txt"這個組里的值為" are you doing"。
"(?!exp)":匹配后面跟的不是exp的位置龟再。如"123abc" 正則 "\d{3}(?!\d)" 匹配3位數(shù)字后非數(shù)字的結(jié)果书闸。
"(?<!exp)":匹配前面不是exp的位置。如 "abc123" 正則 "(?<![0-9])123" 匹配"123"前面是非數(shù)字的結(jié)果也可寫成"(?!<\d)123"利凑。