柚子快報邀請碼778899分享:正則表達(dá)式
柚子快報邀請碼778899分享:正則表達(dá)式
一. 特殊符號的含義
量詞
*:表示前面的模式零次或多次+:表示前面的模式一次或多次?:表示前面的模式零次或一次{n}:表示前面的模式恰好 n 次{n,}:表示前面的模式至少 n 次{n,m}:表示前面的模式至少 n 次且不超過 m 次 分組和捕獲
( ):用于分組和捕獲子表達(dá)式(?: ):用于分組但不捕獲子表達(dá)式 特殊字符
\:轉(zhuǎn)義字符,用于表示特殊字符本身.:表示任意字符(除了換行符\r\n)|:用于指定多個模式的選擇 錨點
^表示字串開頭$表示字串結(jié)尾\b表示一個單詞的邊界,即字與空格間的位置\B表示非單詞的邊界 字符類
[ ]:表示括號內(nèi)的任意一個字符。例如,`[abc]`` 表示字符 “a”、“b” 或 “c”[^ ]:表示除了括號內(nèi)的字符以外的任意一個字符。例如,[^abc] 表示除了字符 “a”、“b” 或 “c” 以外的任意字符\w:表示一個字符,該字符是字母,數(shù)字,下劃線. 等價于[A-Za-z0-9_]\d:表示一個阿拉伯?dāng)?shù)字. 等價于[0-9]\D: 匹配一個非數(shù)字字符。等價于 [^0-9]\s: 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [\f\n\r\t\v]\S: 匹配任何非空白字符。等價于 [^\f\n\r\t\v]
eg: ^[0-9].*[abc]$ 表示"以數(shù)字開頭,以a或b或c結(jié)尾的字串" [^aeiou]表示字串中,所有不是aeiou的字符 ([1-9])([a-z])
二. 正則表達(dá)式可以干什么
測試字符串是否滿足正則表達(dá)的某個格式替換正則表示到的文本從字串中提取正則表示的子字符串
三. 定位查詢
前面講了, ( )用于匹配后捕獲字串的. 但如果( )里是以下面這4個符號?=、?!、?<=、?
exp1(?=exp2): 以 exp2 為定位, 匹配 exp2 前面的 exp1 runoob(?=[\d]+) : 匹配后面是數(shù)字的 runoob [例子]: 匹配一個用’_'分割的字符串, 且最后一個分組沒有 ‘_’ exp1(?!exp2): 匹配 exp1, 但不要在 exp2 之前 runoob(?![\d]+) : 匹配后面不是數(shù)字的 runoob (?<=exp2)exp1: 匹配 exp2 后面的 exp1 (?<=[\d]+)runoob: 匹配前面是數(shù)字的 runoob (?
四. 反向引用
()匹配到的內(nèi)容,會被正則引擎放到緩沖區(qū)中.緩沖區(qū)編號從1開始,最大到99.如果想引用前面緩沖區(qū)匹配到的內(nèi)容, 用 \n 表示即可. 比如 \1 表示第一個緩沖區(qū)匹配到的內(nèi)容.反向引用的最簡單的、最有用的應(yīng)用之一,是匹配出文本中兩個相同的相鄰單詞字串. eg: 匹配 ‘Is is the cost of of gasoline going up up’ 字串中相同的連續(xù)字串.
eg: 用這則表達(dá)式判斷一個數(shù)是否是素數(shù) 首先, 把整數(shù) n 寫成 n 個 1. 比如,數(shù)字 13 寫成 1111111111111. 則表達(dá)式中的1+表示至少一個1,所以11+表示2個以上的1. \1表示(11+)匹配到的串,這樣(11+)\1表示能被2整除. 后面加上’+'就能表示能被3以上整除了
五. shell 腳本中的正則
shell 中使用正則匹配, 用 grep -E 匹配. 但 grep 不能很好的支持抓取分組結(jié)果. 本想用 sed , 但發(fā)現(xiàn)懶惰匹配模式貌似不支持, 改用 perl -pe 獲取分組結(jié)果.
# 取 url 參數(shù)在aaa,bbb 中任意一個,切后面有 oaid 參數(shù)的報文
# perl -pe 抓取 oaid 參數(shù)值: \1 取第一個分組
# grep -v '^$' 去掉空行
oaid=`hdfs dfs -text $fileName | grep -E 'url=(aaa|bbb).*&oaid=(.*?)&.*' | perl -pe 's/.*&oaid=(.*?)&.*/\1/g' | grep -v '^$' | head -1`
echo "oaid: $oaid"
柚子快報邀請碼778899分享:正則表達(dá)式
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。