以下引用內(nèi)容均來自這里
-
(?=exp)##
斷言自身出現(xiàn)的位置的后面能匹配表達式exp钧舌。例如\w+(?=ing)
担汤,可以匹配 后面是ing
的字符串,并且匹配到的內(nèi)容不包含后面的ing
洼冻。"fasfing dancing doing".match(\w+(?=ing))
匹配到的內(nèi)容是"fasf","danc","do"
(?=exp)也叫零寬度正預測先行斷言崭歧,它斷言自身出現(xiàn)的位置的后面能匹配表達式exp。比如\b\w+(?=ing\b)撞牢,匹配以ing結尾的單詞的前面部分(除了ing以外的部分)率碾,如查找I'm singing while you're dancing.時,它會匹配sing和danc
-
(?<=exp)###
斷言自身出現(xiàn)的位置的前面能匹配表達式exp屋彪。所宰。例如/(?<=[abcd])([13579])/
,可以匹配 前面是a/b/c/d 的奇數(shù)(13579)畜挥。"a324r56f9b1c7".match(/(?<=[abcd])([13579])
匹配到的內(nèi)容是"3","1","7"
(?<=exp)也叫零寬度正回顧后發(fā)斷言仔粥,它斷言自身出現(xiàn)的位置的前面能匹配表達式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的后半部分(除了re以外的部分)蟹但,例如在查找reading a book時躯泰,它匹配ading。
-
正則表達式中后向引用在ruby中的使用###
比如一個場景矮湘,要把字符串中的偶數(shù)加上前后中括號斟冕。則可以使用分組的情況
reg = /([24680])/
str = "1234567890"
puts str.gsub(reg, '[\1]') #=>1[2]3[4]5[6]7[8]9[0]
上面的\1
指代的就是正則表達式中的分組1(即正則中從左起的第1個括號)中的匹配到的內(nèi)容
使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內(nèi)容)可以在表達式或其它程序中作進一步的處理缅阳。默認情況下磕蛇,每個分組會自動擁有一個組號景描,規(guī)則是:從左向右,以分組的左括號為標志秀撇,第一個出現(xiàn)的分組的組號為1超棺,第二個為2,以此類推呵燕。
后向引用用于重復搜索前面某個分組匹配的文本棠绘。例如,\1代表分組1匹配的文本再扭。難以理解氧苍?請看示例:
\b(\w+)\b\s+\1\b可以用來匹配重復的單詞,像go go, 或者kitty kitty泛范。這個表達式首先是一個單詞让虐,也就是單詞開始處和結束處之間的多于一個的字母或數(shù)字(\b(\w+)\b),這個單詞會被捕獲到編號為1的分組中罢荡,然后是1個或幾個空白符(\s+)赡突,最后是分組1中捕獲的內(nèi)容(也就是前面匹配的那個單詞)(\1)。
你也可以自己指定子表達式的組名区赵。要指定一個子表達式的組名惭缰,請使用這樣的語法:(?<Word>\w+)(或者把尖括號換成'也行:(?'Word'\w+)),這樣就把\w+的組名指定為Word了。要反向引用這個分組捕獲的內(nèi)容笼才,你可以使用\k<Word>,所以上一個例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b漱受。