正則運算式
壹. 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*(]+ 這幾個匹配部分是不提取直接跳過