正則表達(dá)式詳解

轉(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)義字符“\”。

圖1
假設(shè)進(jìn)行搜索的時候弹澎,你希望連字符號可以出現(xiàn)佩迟,也可以不出現(xiàn)——即,999-99-9999和999999999都屬于正確的格式。這時蝴蜓,你可以在連字符號后面加上“凯肋?”數(shù)量限定符號驱敲。
圖2
另外一個例子:美國汽車牌照的一種格式是四個數(shù)字加上二個字母放案。它的正則表達(dá)式前面是數(shù)字部分“[0-9]{4}”稿湿,再加上字母部分“[A-Z]{2}”。
圖3
1.5開始與結(jié)束符號
^會匹配行或者字符串的起始位置元镀,有時還會匹配整個文檔的起始位置住闯。
$會匹配行或字符串的結(jié)尾雇寇。例如:”^this .+ regex”叁怪,只能匹配以”this”開頭,以及以”regex”結(jié)尾的字符串鸦难,空格也不能包括愚争。同時^符號稱為“否”符號。如果用在方括號內(nèi),^表示不想要匹配的字符筛武。例如,匹配除以字母”X”開頭的所有單詞:”[^X][a-z]+”谍失。
1.6圓括號和空白符號
假設(shè)要從格式為“June 26, 1951”的生日日期中提取出月份部分,用來匹配該日期的正則表達(dá)式如下:
圖4
“\s”符號是空白符號燃乍,匹配所有的空白字符,包括Tab字符色建。如果字符串正確匹配介牙,只需在月份周圍加上一個圓括號創(chuàng)建一個組,然后提取出它的值(例如可以使用Java Matcher匹配器類來操作)。
圖5
1.7快捷符號
為簡便起見,你可以使用一些為常見正則表達(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”。

圖6
1.8懶惰限定符
前面說過了表示次數(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"利凑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浆劲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哀澈,更是在濱河造成了極大的恐慌牌借,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件割按,死亡現(xiàn)場離奇詭異膨报,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)适荣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門现柠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弛矛,你說我怎么就攤上這事够吩。” “怎么了丈氓?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵周循,是天一觀的道長强法。 經(jīng)常有香客問我,道長湾笛,這世上最難降的妖魔是什么饮怯? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮迄本,結(jié)果婚禮上硕淑,老公的妹妹穿的比我還像新娘。我一直安慰自己嘉赎,他們只是感情好置媳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著公条,像睡著了一般拇囊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上靶橱,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天寥袭,我揣著相機(jī)與錄音,去河邊找鬼关霸。 笑死传黄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的队寇。 我是一名探鬼主播声旺,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼益眉,長吁一口氣:“原來是場噩夢啊……” “哼秃殉!你這毒婦竟也來了免绿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤零渐,失蹤者是張志新(化名)和其女友劉穎窒舟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诵盼,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惠豺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拦耐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耕腾。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杀糯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苍苞,我是刑警寧澤固翰,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布狼纬,位于F島的核電站,受9級特大地震影響骂际,放射性物質(zhì)發(fā)生泄漏疗琉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一歉铝、第九天 我趴在偏房一處隱蔽的房頂上張望盈简。 院中可真熱鬧,春花似錦太示、人聲如沸柠贤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臼勉。三九已至,卻和暖如春餐弱,著一層夾襖步出監(jiān)牢的瞬間宴霸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工膏蚓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓢谢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓驮瞧,卻偏偏與公主長得像氓扛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剧董,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容