入门正则表达式正则表达式
正则表达式(百科),一直在学习,一直在忘记,一直在不经意间用到它,想一想本身,或许真的很笨,时至今日,仍只会些皮毛的匹配,始终没有获得要领。但是工做在继续,每当本身孤军做战至深夜,彷佛总也看不到正确的正则表达式在无边的黑夜里向我招手。头疼至极,不得已向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版本身开发的,发上来跟你们分享,见附件。
我会坚持学习它,但愿本身可以驾驭,轻松用于工做中。若路过的您有更好的方法,请您多多指教我这个菜鸟。
感谢!