正規表示式學習

2021-05-28 01:04:12 字數 3657 閱讀 4540

概念

正規表示式,就是用某種模式去匹配一類字串的乙個公式。

基礎

下表列出了所有的元字元和對它們的乙個簡短的描述。  

簡單例子

vi 命令作用

:%s/ */ /g

把乙個或者多個空格替換為乙個空格

:%s/ *$//

去掉行尾的所有空格

:%s/^/ /

在每一行頭上加入乙個空格

:%s/^[0-9][0-9]* //

去掉行首的所有數字字元

:%s/b[aeio]g/bug/g

將所有的bag、beg、big和bog改為bug。

:%s/t\([aou]\)g/h\1t/g

將所有tag、tog和tug分別改為hat、hot和hut(注意用group的用法和使用\1引用前面被匹配的字元)

將所有方法foo(a,b,c)的例項改為foo(b,a,c)。這裡a、b和c可以是任何提供給方法foo()的引數。也就是說我們要實現這樣的轉換:

之前 之後

foo(10,7,2) foo(7,10,2)

foo(x+13,y-2,10) foo(y-2,x+13,10)

foo( bar(8), x+y+z, 5) foo( x+y+z, bar(8), 5)

下面這條替換命令能夠實現這一魔法:

:%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g

現在讓我們把它打散來加以分析。寫出這個表示式的基本思路是找出foo()和它的括號中的三個引數的位置。第乙個引數是用這個表示式來識別的::\([^,]*\),我們可以從裡向外來分析它:

[^,] 除了逗號之外的任何字元

[^,]* 0或者多個非逗號字元

\([^,]*\) 將這些非逗號字元標記為\1,這樣可以在之後的替換模式表示式中引用它

\([^,]*\), 我們必須找到0或者多個非逗號字元後面跟著乙個逗號,並且非逗號字元那部分要標記出來以備後用。

現在正是指出乙個使用正規表示式常見錯誤的最佳時機。為什麼我們要使用[^,]*這樣的乙個表示式,而不是更加簡單直接的寫法,例如:.*,來匹配第乙個引數呢?設想我們使用模式.*來匹配字串"10,7,2",它應該匹配"10,"還是"10,7,"?為了解決這個兩義性(ambiguity),正規表示式規定一律按照最長的串來,在上面的例子中就是"10,7,",顯然這樣就找出了兩個引數而不是我們期望的乙個。所以,我們要使用[^,]*來強制取出第乙個逗號之前的部分。

這個表示式我們已經分析到了:foo(\([^,]*\),這一段可以簡單的翻譯為「當你找到foo(就把其後直到第乙個逗號之前的部分標記為\1」。然後我們使用同樣的辦法標記第二個引數為\2。對第三個引數的標記方法也是一樣,只是我們要搜尋所有的字元直到右括號。我們並沒有必要去搜尋第三個引數,因為我們不需要調整它的位置,但是這樣的模式能夠保證我們只去替換那些有三個引數的foo()方法呼叫,在foo()是乙個過載(overoading)方法時這種明確的模式往往是比較保險的。然後,在替換部分,我們找到foo()的對應例項,然後利用標記好的部分進行替換,是把第一和第二個引數交換位置。

常用的正規表示式主要有以下幾種:

匹配中文字元的正規表示式: [\u4e00-\u9fa5]

評注:匹配中文還真是個頭疼的事,有了這個表示式就好辦了哦

獲取日期正規表示式:\d[年|\-|\.]\d[月|\-|\.]\d日?

評注:可用來匹配大多數年月日資訊。

匹配雙位元組字元(包括漢字在內):[^\x00-\xff]

評注:可以用來計算字串的長度(乙個雙位元組字元長度計2,ascii字元計1)

匹配空白行的正規表示式:\n\s*\r

評注:可以用來刪除空白行

匹配html標記的正規表示式:]*>.*?|<.>

評注:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的巢狀標記依舊無能為力

匹配首尾空白字元的正規表示式:^\s*|\s*$

評注:可以用來刪除行首行尾的空白字元(包括空格、製表符、換頁符等等),非常有用的表示式

評注:表單驗證時很實用

評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求

匹配帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-za-z][a-za-z0-9_]$

評注:表單驗證時很實用

匹配國內**號碼:\d-\d|\d-\d

評注:匹配形式如 0511 - 4405222 或 021 - 87888822

匹配身份證:\d[\d|x]|\d

評注:中國的身份證為15位或18位

匹配特定數字:

^[1-9]\d*$ //匹配正整數

^-[1-9]\d*$ //匹配負整數

^-?[1-9]\d*$ //匹配整數

^[1-9]\d*|0$ //匹配非負整數(正整數 + 0)

^-[1-9]\d*|0$ //匹配非正整數(負整數 + 0)

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮點數

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配負浮點數

^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮點數

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非負浮點數(正浮點數 + 0)

^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮點數(負浮點數 + 0)

評注:處理大量資料時有用,具體應用時注意修正

匹配特定字串:

^[a-za-z]+$ //匹配由26個英文本母組成的字串

^[a-z]+$ //匹配由26個英文本母的大寫組成的字串

^[a-z]+$ //匹配由26個英文本母的小寫組成的字串

^[a-za-z0-9]+$ //匹配由數字和26個英文本母組成的字串

^\w+$ //匹配由數字、26個英文本母或者下劃線組成的字串

評注:最基本也是最常用的一些表示式

function isregu(regu,s)

'正規表示式校驗

if regu="" then

exit function

end if

dim re,sre

set re = new regexp

re.pattern = regu

sre = re.test(s)

if sre = true then

isregu = true

else

isregu = false

end if

end function

tmp=" "

if (isregu("\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*",tmp )) =false then

msgbox "e-mail位址不合法 !"

fieldcheck#n=false

end if

正規表示式學習

1.元字元 1 匹配任何單個字元 2 匹配括號中的任何乙個字元 可以再括號中使用連字元 來指定子都的區間來簡化表示,如a 0123456789 c等價於a 0 9 c 3 將 之間括起來的表示式定義為 組 4 將兩個匹配條件進行邏輯 或 運算 z f ood則匹配 zood 或 food 5 匹配0...

正規表示式學習

只是點皮毛,先湊合用著了,順便鄙視一下sqlserver,居然不支援正則。b 元字元,代表著單詞的開頭或結尾,也就是單詞的分界處。d 數字 s 任意的空白符,包括空格,製表符 tab 換行符,中文全形空格等 w 字母或數字或下劃線或漢字等 匹配字串的開始 匹配字串的結束 轉義符 除換行符以外的任意字...

正規表示式學習

1 b代表單詞的開頭或結尾,也就是單詞的分解處 2 是乙個元字元,匹配除了換行符以外的任意字元,表示數量,連在一起意味著任意數量的不包含換行的字元。3 d匹配一位數字 0,或1,或2,或.不是元字元,只匹配它本身 連字元 或者減號,或者中橫線 為了避免重複也可以使用 d d。這裡 d後面的 的意思是...