正則運算式

壹.  SKILL Function
1. rexCompile
2. rexExecute
3. rexMagic
4. rexMatchAssocList
5. rexMatchList
6. rexMatchp
7. rexReplace
8. rexSubstitute

 

 

這裏的關鍵命令是rexMatchp,函數形式為rexMatchp(t_pattern S_target),這個命令將在第二個參數中查找滿足第一個參數(模式)的條件,如果找到返回真值,否則返回假值。

正則運算式(pattern)的組成字元

 語法             含義

  c          匹配任意非特殊字元

  .          匹配任意字元

\          用在特殊字元前面代表特殊字元本身,用在 <, >, (, ), and 1,...,9, 的含義在下面描述

 [c...]      一對方括弧中包含一些字元將匹配括弧中的任意一個字元,如果第一個字元是 ^ 則表示不匹配括弧中的所有字元,[a-z]表示匹配a到z之間的任一字元,"-”表示範圍。

  *          用在一個以上描述的字元或pattern後表示匹配該字元或pattern0次或多次。

  +          類似*,區別在於匹配至少一次

 \(..\)      如果包含在這個符號中的字串匹配上了,被匹配的字元可以被提取出來(最多支援9中匹配)

 \n          和上一個符號對應,反斜杠後跟一個數字將可以提前到上一個符合保留的字串

 \<...\>     這個符號表示完全匹配一個字串的開始和結尾

 rs          2個正則運算式的組合將盡可能多的匹配r並匹配一個s

 ^, $        ^表示字串的開始, $表示字串的結尾

 

常用正則匹配函數
 

 

 

RE的表式法說明

Regular Expression 的表式字串的內容主要可以分為兩大類:

1.      Characters : 一般字元(文數字元), 所代表的意義與元字面的意義相同

2.      Operators : 特殊字元(非文數字字元), 代表某種特殊規則的意義. 若要取消其代表意義,必需使用”\”跳脫字元.

例如:

1.      “foo” 的RE表示字串”foo”的意思

2.      “[Ff]oo 的RE表示字串”Foo” 或 “foo”的意思

3.      “F*”的RE表示F這個字元會出現0次或多次

4.      “F\*” 的RE表示字串”F*”的意思

5.       . 句號(period)代表任一個字元, 如”.at”可以符合 bat, cat, rat等,任何字開頭,結尾是at的單字

6.      ^(carat) 表示位置在開頭,如”^Mary” 代表以Mary開頭

7.      $(dollor-sign) 表示位置在結尾,如”Mary$” 代表以Mary結尾

8.      []中括號(brackets)代表集合中的任一字元,如”[01256]”代表0, 1, 2, 5, 6 這個及何中的任何一個字元

9.      –連字號(dash)在中括號內表示範圍,如”[0-9]”代表0到9的任一個單一的數字

10.  ^(carat)在中括號內表示否定, 如”[^aeiou]”代表除了a, e, I, o, u 這幾個母音之外的字元

11.   |(pipe)表示可選擇的,如”cat|dog|bird”代表cat, dog, bird中之ㄧ皆可(or的概念)

12.  ?問號(question mark)表示前面的字元貨及何出現0次或1次,如”colou?r”代表u這個自可出現也可不出現

13.  +加號(plus)表示前面的字元或集合出現1 次或多次,如”ap+le”代表p這個自至少出現一次

14.  *星號(asterisk)表示前面的字元或集合出現0次或多次,如”section[0-9]*”代表數字可出現也可不出現

15.  {}大括號(curly-braces)表示前面的字元或集合出現的次數,如”c{5,8}”代表c這個自重複出現5到8次

16.   

在skill程式開發中,也經常會用到正則運算式類匹配或者限制一些資料,下面是在網上找的常用正則運算式:

 只能輸入數位:“^[0-9]*$”

只能輸入n位元的數位:“^d{n}$”

 只能輸入至少n位元數字:“^d{n,}$”

只能輸入m-n位元的數位:“^d{m,n}$”

只能輸入零和非零開頭的數位:“^(0|[1-9][0-9]*)$”

只能輸入有兩位小數的正實數:“^[0-9]+(.[0-9]{2}) $”

只能輸入有1-3位小數的正實數:“^[0-9]+(.[0-9]{1,3}) $”

只能輸入非零的正整數:“^+ [1-9][0-9]*$”

只能輸入非零的負整數:“^-[1-9][0-9]*$”

只能輸入長度為3的字元:“^.{3}$”

 只能輸入由26個英文字母組成的字串:“^[A-Za-z]+$”

只能輸入由26個大寫英文字母組成的字串:“^[A-Z]+$”

只能輸入由26個小寫英文字母組成的字串:“^[a-z]+$”

只能輸入由數位和26個英文字母組成的字串:“^[A-Za-z0-9]+$”

只能輸入由數位、26個英文字母或者下劃線組成的字串:“^w+$”

驗證用戶密碼:“^[a-zA-Z]\w{5,17}$”正確格式為:以字母開頭,長度在6-18之間, 只能包含字元、數位和下劃線。

驗證是否含有^%&',;= $"等字元:“[^%&',;= $x22]+”

只能輸入漢字:“^[u4e00-u9fa5],{0,}$”

驗證Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”

驗證InternetURL:“^http://([w-]+.)+[w-]+(/[w-./ %&=]*) $”

 驗證電話號碼:“0\d{2}-\d{7,8}|0\d{3}-\d{7}|\d{7,8}” 正確格式為:“010-12345678”,“0123-1234567”,“1234567”, “12345678”。

驗證身份證號(15位元或18位元數字):\d{18}|\d{17}[a-zA-Z]{1}|\d{15}

驗證一年的12個月:“^(0 [1-9]|1[0-2])$”正確格式為:“01”-“09”和“1”“12”

驗證一個月的31天:“^((0 [1-9])|((1|2)[0-9])|30|31)$” 正確格式為:“01”“09”和“1”“31”。

 

正則運算式用於字串處理、表單驗證等場合,實用高效。現將一些常用的運算式收集於此,以備不時之需。 

   匹配中文字元的正則運算式: [\u4e00-\u9fa5]

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

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

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

   匹配空白行的正則運算式:\n\s*\r

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

   匹配HTML標記的正則運算式:< (\S*?)[^>]*>.*?|< .*? />

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

   匹配首尾空白字元的正則運算式:^\s*|\s*$

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

   匹配Email地址的正則運算式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

   評注:表單驗證時很實用

   匹配網址URL的正則運算式:[a-zA-z]+://[^\s]*

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

   匹配帳號是否合法(字母開頭,允許5-16位元組,允許字母數位下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

   評注:表單驗證時很實用

   匹配國內電話號碼:\d{3}-\d{8}|\d{4}-\d{7}

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

   匹配騰訊QQ號:[1-9][0-9]{4,}

   評注:騰訊QQ號從10000開始

   匹配中國郵遞區號:[1-9]\d{5}(?!\d)

   評注:中國郵遞區號為6位元數字

   匹配身份證:\d{15}|\d{18}

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

   匹配ip地址:\d+\.\d+\.\d+\.\d+

   評注:提取ip地址時有用

   匹配特定數字:

   ^[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個英文字母或者下劃線組成的字串

"^\d+$" //非負整數(正整數 + 0)

"^[0-9]*[1-9][0-9]*$" //正整數

"^((-\d+)|(0+))$" //非正整數(負整數 + 0)

"^-[0-9]*[1-9][0-9]*$" //負整數

"^-?\d+$" //整數

"^\d+(\.\d+)?$" //非負浮點數(正浮點數 + 0)

"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮點數

"^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮點數(負浮點數 + 0)

"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //負浮點數

"^(-?\d+)(\.\d+)?$" //浮點數

"^[A-Za-z]+$" //由26個英文字母組成的字串

"^[A-Z]+$" //由26個英文字母的大寫組成的字串

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

"^[A-Za-z0-9]+$" //由數位和26個英文字母組成的字串

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

"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址

"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$" //url

/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日

/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年

"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil

/^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/     //電話號碼

"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"   //IP地址

匹配中文字元的正則運算式: [\u4e00-\u9fa5]

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

匹配空行的正則運算式:\n[\s| ]*\r

匹配HTML標記的正則運算式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正則運算式:(^\s*)|(\s*$)

匹配Email地址的正則運算式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配網址URL的正則運算式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$

匹配帳號是否合法(字母開頭,允許5-16位元組,允許字母數位下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

匹配國內電話號碼:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?

匹配騰訊QQ號:^[1-9]*[1-9][0-9]*$

 

範例:

Item = "Power TOP *(7710.00 -1865.00) to *(6705.00 -1615.00)"

rexCompile("\\([A-Za-z]*\\)[ ]+\\([A-Za-z]*\\)[ *(]+\\([-?0-9.]*\\)[ ]+\\([-?0-9.]*\\)[) to*(]+\\([-?0-9.]*\\)[ ]+\\([-?0-9.]*\\)")

 

rexExecute( item )

str1 = rexSubstitute("\\1")

str2 = rexSubstitute("\\2" )

str3 = rexSubstitute("\\3" )

str4 = rexSubstitute("\\4" )

str5 = rexSubstitute("\\5" )

str6 = rexSubstitute("\\6" )

printf("%s<->%s<->%s<->%s<->%s<->%s\n" str1 str2 str3 str4 str5 str6)

 

輸出結果:

Power <-> TOP <->7710.00<->-1865.00<->6705.00<->-1615.00

 

說明:

; \\(...\\) 結構表示匹配的部分將可以用\\1 ~ \\9提取出來
; [A-Z]表示匹配A~Z的字元,+表示至少有一個這樣的字元 *表示用在一個以上描述的字元

; [-?0-9.] 表示匹配負號可有可無,其他為0到 9 及小數點符號

; [ ]+ , [ *(]+ , [) to*(]+ 這幾個匹配部分是不提取直接跳過

 

arrow
arrow
    全站熱搜

    熊熊 發表在 痞客邦 留言(0) 人氣()