入門正則表達式正則表達式
正則表達式(百科),一直在學習,一直在忘記,一直在不經意間用到它,想一想本身,或許真的很笨,時至今日,仍只會些皮毛的匹配,始終沒有獲得要領。但是工做在繼續,每當本身孤軍做戰至深夜,彷佛總也看不到正確的正則表達式在無邊的黑夜裏向我招手。頭疼至極,不得已向BBS上的A大,水版等高手求救。很快,那幾個精煉的字符便一掃本身的鬱悶,有時晃然明白,有些個圈內的朋友是多麼地好!可讓本身少走不少彎路。sql
但是朋友終究只會救本身於一時,不能一世,如何在他們的HELP之下讓本身也會「漁」?總結一些方法,但願有路過的朋友多多指教。ide
方法1. 用到時,不能第一時間寫出來,速查簡明的教程,如:正則表達式30分鐘入門教程 優點很明顯,這種實戰型教程不像有些教科書那樣晦澀難懂,它更像一本字典,現在我將這個教程打印出來,放在案邊,能解決我大部分問題,而且在我有時間時,將用過的複習一下並反覆地看教程,我相信多好,終究會慢慢看更多的東西出來。工具
方法2. 每次上BBS上看這類的貼子,遇到不懂的,或者感受有理解難度的,先收藏之,事後,反覆學習和調試他人的方法。如:學習
實例1:去除如下配置文件中的重複行(該配置文件可能有幾十萬行):測試
- 配置文件XXX.ini內容以下:
- [config]
- key=一心一意
- key=三心二意
- key=十全十美
- key=百年好合
- key=千金萬馬
- key=萬馬奔騰
- key=狗急跳牆
- key=紙上談兵
- key=虎虎生威
- key=高瞻遠矚
- key=一心一意
水版給的答案是:編碼
- $sText = FileRead('XXX.ini')
- $sRer = StringRegExpReplace($sText, '(key=.+)(?=[^\1]+\1)', '')
- $sRer = StringRegExpReplace($sRer, '^\v+|\r?\n(?=\r?\n)|\r?\n$', '') ;去掉以前遺留下來的空行!
- MsgBox(0, '', $sRer)
實例2:從一個字符串中提取出IP地址:spa
A大的:.net
- Local $Str = '\\192.168.8.30\log\yanshi'
- Local $Test = StringRegExpReplace($str, '.*\\((?:\d+\.){3}\d+)\\.*', '$1')
- MsgBox(0, '替換結果', $Test)
- 匹配模式也能夠:
- Local $Str = '\\192.168.8.30\log\yanshi'
- Local $Test = StringRegExp($str, '(?:\d+\.){3}\d+', 1)
- If Not @Error Then MsgBox(0, '', $Test[0])
匹配最後一行:調試
- stringregexp($str,'.+$',3)
取所在地:
- Global $sText
- $Source = _INetGetSource('http://www.ip138.com/ips.asp?ip=' & InputBox("IP", "請輸入IP地址"))
- $aRe = StringRegExp($Source, '(?<=<li>)[^<]+', 3)
- For $i = 0 To UBound($aRe) - 1
- $sText &= $aRe[$i] & @CRLF
- Next
- MsgBox(0, '', $sText)
附一些網上廣爲流傳轉載的【不怎麼嚴謹,若用於工做中請謹慎測試一下】:
- 匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</\1>|<.*? />
- 評註:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的嵌套標記依舊無能爲力
- 匹配首尾空白字符的正則表達式:^\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{14}\w|\d{17}\w$
或者:
^\d{14}\d{3}?\w$
- 評註:中國的×××爲15位或18位
- 匹配ip地址: $bdz="^\d{1,3}$"
$aReturn = StringRegExp($csz,$bdz, 3)
If Not IsArray($aReturn) Then
MsgBox(64,"警告",$dailiip & " 中的 " & $csz & " 不是有效IP地址範圍!")
$IPchajieq= 1
Else
If $csz > 255 Then
MsgBox(64,"警告",$dailiip & " 中的 " & $csz & " IP數值超出!")
$IPchajieq= 1
EndIf
EndIf- 評註:提取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個英文字母或者下劃線組成的字符串
- 評註:最基本也是最經常使用的一些表達式
方法三:多參與一些老大們在BBS上的學習測試,多寫,盡力去嘗試。無數的實戰必定能煉成神功。呵呵
方法四:用一些功能豐富便利的調試工具,好比上邊入門教程中提到的,我本身用的是A版本身開發的,發上來跟你們分享,見附件。
我會堅持學習它,但願本身可以駕馭,輕鬆用於工做中。若路過的您有更好的方法,請您多多指教我這個菜鳥。
感謝!