| #cs學習deercao提供的正則30分鐘資料的筆記正則表達式就是個字符串處理語言,是用來“查找你想要的字符串和進行字符串的替換“。網頁、程序或文件中有關文本內容的處理部分都可以應用正則表達式完成。在正則表達式中,元字符有特殊功能,如\w匹配“數字、字母、下劃線、漢字”,這個在afan的正則表達式工具中有詳細說明。字符類:用[]括起來的就是一個字符類,如[aeu]匹配 a 或 e 或 u? ?, [.?!] 匹配 .? ?或? ????或??! ,此刻的字符類里的元字符就? ?? ???不代表特殊的含義了。? ? ? ? ? ? ? ? ([^\r]+) 我以前理解為”排除回車符號的至少一個什么字符的匹配“不如”匹配一個及以上非回車的字符“好理解,而且要注意其中? ? ? ? ? ? ? ? ()的適用場景,用不用他效果有時差別真的很大!|??:就是多條件匹配,如用 \d{3}-\d{7}|\d{7} 匹配010-1234556或1234556,但注意別寫成 \d{7}|\d{3}-\d{7},因為它只能匹配連續的? ? 7位數字或3位數字-7位數字中的前7位了,我的理解是“在進行多條件匹配時,要把最大的匹配范圍寫到最前面,然后依次減小匹配范圍”? ? ? ?分組 :用??() 括起來就是一個分組,如用于IP地址的匹配模式??(\d{1,3}\.){3}\d{1,3},分組()里的內容意思是”匹配1-3位的數字后面跟個? ?? ? .??的形式重復3次,最后再跟1個1-3位的數字。? ? ? ?? ? 分組還可以后向引用 ,如IP可用模式 (\d{1,3}\.){3}\d{1,3}\.匹配,就可以寫成 (\d{1,3}\.){3}\1,這個\1就代表分組1(\d{3}\.)? ? ? ?? ? 所匹配的文本內容了。分組號是從 1 2 逐次命名的,\0代表正則表達式本身。? ? ? ?? ? 組名可用(?<GroupName>)定義,如(\d{1,3}\.){3}\d{1,3}中的組可(?<Group1>\d{3}\.)定義,引用則用\k<Group1>,完整語法為? ? ? ?? ? (?<Group1>\d{3}\.){3}\k<Group1> ,其中的 < >可用單引號 '??' 替換,則變成了 (?'Group1'\d{3}\.){3}\k'Group1'??.分組的3種語法:? ? (exp)? ?匹配exp,并捕獲文本到自動命名的組里? ? ? ? (?<GroupName>exp)??匹配exp,并捕獲文本到 自定義的<GroupName>組里? ? ? ? (?:exp)??匹配exp,但不給組分配組號,也不捕獲文本到組里? ? ? ?零寬斷言語法(下面有例子) :? ? (?=exp)? ?匹配exp前面的內容? ? ? ? (?<=exp)??匹配exp后面的內容? ? ? ? (?!exp)? ?可以看成 Str(?!exp),就是Str后不匹配exp? ? ? ? (?<!exp)??可以看成(?<!exp)Str,就是Str前不匹配exp? ? ? ?注釋:語法為 (?#comments)? ? 例 2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。懶惰匹配和貪婪匹配? ?? ???例??用 a.*b??匹配??aabab? ? ? ? 貪婪模式是最大匹配模式,a.*b匹配以a開頭以b結尾中間有任意數量字符的單詞,則貪婪匹配整個字符串aabab而不是aab或ab? ? ? ? 懶惰模式是在保證成功匹配的情況下進行最小匹配,a.*?b則匹配??aab(第1至第3個字母)??和??ab(第4至第5個字母)? ? ? ? 為什么懶惰模式不是匹配 ab(第2至第3個字母),因最先匹配優于貪婪和懶惰匹配模式,懶惰模式下該例最先匹配aab,然后是 ab(第4至第5個字母)? ? 懶惰模式的幾種常用語法? ? ? ???*? 重復任意次,但盡可能少重復? ???+? 重復1次或更多次,但盡可能少重復? ????? 重復0次或1次,但盡可能少重復? ???{n,m}? 重復n到m次,但盡可能少重復? ???{n,}? 重復n次以上,但盡可能少重復平衡組和遞歸匹配??---??根本沒讀懂?如果朋友有這方面的AUTOIT應用的例子,請提供!曾經犯過的錯誤:1。#ce;example1??匹配數字#include <array.au3>Local $Str="我想匹配出字符串中的數字部分," & @CRLF & _? ? ? ? ? ? ? ?? ? "第1個數字:4869579" & @CRLF & _? ?? ?? ???"第1個數字:010-4869579" & @CRLF & _? ? ? ? ? ? ? ?? ? "第2個數字:0201-48695795" & @CRLF & _? ? ? ? ? ? ? ?? ? "第2個數字:(010)-4895795" & @CRLF & _? ? ? ? ? ? ? ?? ? "第2個數字:010)-4895795" & @CRLF & _? ? ? ? ? ? ? ?? ? "第2個數字:(0201)-48695795" & @CRLF & _? ? ? ? ? ? ? ?? ? "第3個數字:230604198001025771" & @CRLF & _? ? ? ? ? ? ? ?? ? "第4個數字:23060419800102577A" & @CRLF & _? ? ? ? ? ? ? ?? ? "第4個數字:23060419800102577X" & @CRLF & _? ? ? ? ? ? ? ?? ? "第5個數字:230604198001026" & @CRLF & _? ? ? ? ? ? ? ?? ? "第6個數字:177608" & @CRLF & _? ? ? ? ? ? ? ?? ? "第7個數字:2010年12月17日"Local??$Result=StringRegExp($Str,"\b\d{3}-\d{7}\b|\b\d{7}\b",3);注意多條件書寫的順序,由左及右:大范圍->小范圍_ArrayDisplay($Result) ;OKLocal??$Result=StringRegExp($Str,"\d{3}-\d{7}|\d{4}-\d{8}",3)_ArrayDisplay($Result) ;OKLocal??$Result=StringRegExp($Str,"\(?0\d{2}[) -]?\d{8}",3);匹配結果不好!_ArrayDisplay($Result)Local??$Result=StringRegExp($Str,"\(0\d{2}\)[-]?\d{7}|\(0\d{3}\)[-]?\d{8}",3);匹配結果不好!_ArrayDisplay($Result)Local??$Result=StringRegExp($Str,"\d{17}[\d|X]|\d{15}",3);問題:23060419800102577a,只匹配前15位數字,難道是第一個條件\d{17}[\d|X]不匹配就用\d{15},結果顯示其匹配的結果?結果是這樣的。;X,還以為是個元字符,有什么特殊含義!就是一個普通的匹配字符,[X]匹配X ,想多了!_ArrayDisplay($Result) ;OKLocal $Result=StringRegExp($Str,"\b[1-9]\d{5}\b",3);Local $Result=StringRegExp($Str,"[^\d][1-9]\d{5}$");條條大路通羅馬,感謝lpxx;Local $Result=StringRegExp($Str,"[1-9]\d{5}",3) 這個提取不精確,只要是連續的6位數字它都匹配_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"\d{4}[年|\-|\.]\d{1,2}[月|\-|\.]\d{1,2}日",3)_ArrayDisplay($Result);example2??匹配單詞或漢字Local $Str="HI hi,I'm a newuser for autoit,his name is zgk!please 多多指教,鄒國奎英語實在是說不過去,ahiha!"Local $Result=StringRegExp($Str,"hi",3);提取hi不精確_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"\bhi\b",3);提取hi精確,區分大小寫_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"\b(?i)hi\b",3);(?i)表示不區分大小寫,這樣HI也可以匹配了,(?-i)表示區分大小寫_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"鄒國奎",3)_ArrayDisplay($Result);example3??以下是對 ^的排除功能進行練習------------------------------------重點掌握Local $Num="192.168.1.10"Local $Result=StringRegExp($Num,'[^.]+',3);Local $Result=StringRegExp($Num,'[^.]*',3)_ArrayDisplay($Result)Local $Num="Default Gateway:? ?? ? 192.168.1.1"Local $Result=StringRegExp($Num,'Default Gateway:\h*[^\r]+',3)_ArrayDisplay($Result)Local $Result=StringRegExp($Num,'Default Gateway:\h*([^\r]+)',3)_ArrayDisplay($Result);很神奇的(),加上就只匹配字符串中的IP,不加就匹配整個字符串?? ?該例非常值得學習與思考??[^]與 () 的配合使用!Local $Num="Sharon Lee Smith, Design Works Incorporated, CA, 95012"Local $Result=StringRegExp($Num,'([^,]*),([^,]*),([^,]*),(.*)',3);Local $Result=StringRegExp($Num,'([^,]*),\w*',3);Local $Result=StringRegExp($Num,"(([^,]*),){3}(.*)",3)_ArrayDisplay($Result)Local $Num="Alexander Weatherworth, The Crafts Store, CA, 95014"Local $Result=StringRegExp($Num,'[^,]*',3);用*就會匹配出 4??個空格字符,因為當*表示0個數量,那[^,]*是匹配0個非,字符,而[^,]又必須匹配一個字符,空格就被匹配出來,依據具體;環境,也可能匹配出??,? ? 或其他什么字符來;如果將*改成+,那[^,]+是至少匹配一個非,字符,就自然不可能匹配空白字符了,不過[^,]+和([^,]+)這里效果是一樣的。_ArrayDisplay($Result);那如果我想匹配出----? ?Alexander Weatherworth, The Crafts Store??Local $result=StringRegExp($str,"Alexander Weatherworth, [^,]+",3);"Alexander Weatherworth,匹配本身, [^,]+至少匹配一個非,字符,到The Crafts Store,中的,時,就自然停止匹配了,想要的匹配結果就得到了;如果只想匹配出---? ?The Crafts StoreLocal $result=StringRegExp($str,"Alexander Weatherworth, ([^,]+)",3);加 () 就OK,()的作用目前還沒明白,當個公式記吧。;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Local $FilePath="c:\test\test2\test.txt"Local $Result=StringRegExp($FilePath,"[^\\]+",3);感覺就象stringsplit(),但如何用正則提取“文件路徑 文件名 文件后綴”?不想用StringRegExpReplace()完成?_ArrayDisplay($Result)#cs總結(感謝afan):1.以上2例都是通過 [^] 來排除某個符號 .??or??,??最后通過 + 來完成,注意不能用 * 代替??+,否則當 *匹配0次時,[^.]會匹配“空格或制表符”#ce;example4? ?零寬斷言4種語法的例子;(?=exp)??匹配exp前面的內容(正向預搜索-感謝3mile)Local $Str="南京銀行對同洲電子說:你也算3網融合的巨頭,一直在陽痿!" & @CRLF & _? ?? ?? ???"同洲電子對南京銀行說:你也算銀行的佼者,到處叫爹!" & @CRLF & _? ? ? ? ? ? ? ?? ? "nian jing yinhan??to tong??zhou dian zi said:i am your father. a ha!"Local $Result=StringRegExp($Str,".*(?=a)",3)_ArrayDisplay($Result)Local $Result=StringRegExp($Str,".*(?=到處叫爹)",3)_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"\w+(?=到處叫爹)",3);問題:??.*就能實現“正向預搜索,??\w+就無任何反應?;理解 :.*將 匹配范圍定義到 ”行“,\w+將匹配范圍定義到”單詞“,不知道這樣理解是否正確?但這樣理解確實解釋的通。比如;\w+(?=到處叫爹) ,”到處叫爹"根本就不是一個單詞,如果把它改成"diedaochujiaodie",那么就會匹配出 '??die??'? ?來,真費勁_ArrayDisplay($Result)#cs上面的正則對這個文本怎么不好使?===========================================================================Interface List0x1 ........................... MS TCP Loopback interface0x2 ...00 50 56 c0 00 08 ...... VMware Virtual Ethernet Adapter for VMnet80x3 ...d8 5d 4c 70 db b3 ...... Realtek RTL8139 Family PCI Fast Ethernet NIC - 數據包計劃程序微型端口======================================================================================================================================================Active Routes:Network Destination? ?? ???Netmask? ?? ?? ? Gateway? ?? ? Interface??Metric? ?? ?? ? 0.0.0.0? ?? ?? ? 0.0.0.0? ?? ?192.168.1.1? ???192.168.1.7? ?? ?? ? 20? ?? ???127.0.0.0? ?? ???255.0.0.0? ?? ???127.0.0.1? ?? ? 127.0.0.1? ?? ?? ? 1? ?? ?192.168.1.0? ? 255.255.255.0? ?? ?192.168.1.7? ???192.168.1.7? ?? ?? ? 20? ?? ?192.168.1.7??255.255.255.255? ?? ???127.0.0.1? ?? ? 127.0.0.1? ?? ?? ? 20? ? 192.168.1.255??255.255.255.255? ?? ?192.168.1.7? ???192.168.1.7? ?? ?? ? 20? ? 192.168.128.0? ? 255.255.255.0? ? 192.168.128.1? ?192.168.128.1? ?? ?? ? 20? ? 192.168.128.1??255.255.255.255? ?? ???127.0.0.1? ?? ? 127.0.0.1? ?? ?? ? 20??192.168.128.255??255.255.255.255? ? 192.168.128.1? ?192.168.128.1? ?? ?? ? 20? ?? ???224.0.0.0? ?? ???240.0.0.0? ?? ?192.168.1.7? ???192.168.1.7? ?? ?? ? 20? ?? ???224.0.0.0? ?? ???240.0.0.0? ? 192.168.128.1? ?192.168.128.1? ?? ?? ? 20??255.255.255.255??255.255.255.255? ?? ?192.168.1.7? ???192.168.1.7? ?? ?? ? 1??255.255.255.255??255.255.255.255? ? 192.168.128.1? ?192.168.128.1? ?? ?? ? 1Default Gateway:? ?? ? 192.168.1.1===========================================================================Persistent Routes:??None????要求提取出”? ?Default Gateway: “? ?后面的? ?IP地址#ceLocal? ?$file=FileOpen(@ScriptDir&"\temp.txt")Local? ?$str=FileRead($file)Local??$result=StringRegExp($str,"Default Gateway:\h*([^\r]+)",3);\h* 匹配任意數量水平空白字符;[^\r]排除回車符,應該是以 \r 為分割點取后面的部分----我的理解有問題?;[^\r]+??匹配若干個不是回車的字符(感謝水木子),這樣確實能把后面的內容提取出來,關鍵在于如何不匹配? ?Default Gateway: 加上后面的;0或多個空白水平符號,這時的 ()??,就很關鍵,加上它就可以不匹配出,但該怎么理解它呢?;其實??Local??$result=StringRegExp($str,"Default Gateway:\h*([^\s]+)",3)??更好理解,以 "空白符號為分割點取后面的部分“;Local??$result=StringRegExp($str,"Default Gateway:\h*([^\r].*)",3) 將 + 改成??.*??,也行_ArrayDisplay($result)Local??$result=StringRegExp($str,"\s\d+\.\d+\.\d+\.\d+\r",3)_ArrayDisplay($result)Local??$result=StringRegExp($str,"(?<=\s)\d+\.\d+\.\d+\.\d+(?=\s)",3);擴展一下,提取其中的所有IP形式_ArrayDisplay($result)Local??$result=StringRegExp($str,"(?<=\s)((\d+\.){3}\d+)(?=\s)",3);為什么不能將上面的正則模式改為這個模式?_ArrayDisplay($result);example5? ?學習利用[^] 或 ([^])與零寬斷言的后匹配的比較Local $Str="南京銀行對同洲電子說:你也算3網融合的巨頭,一直在陽痿!" & @CRLF & _? ?? ?? ???"同洲電子對南京銀行說:你也算銀行的佼者,到處叫爹!" & @CRLF & _? ? ? ? ? ? ? ? ? ? ? ? "nian jing yinhan??to tong??zhou dian zi said:i am your father.a ha!"??& @CRLF & _? ? ? ? ? ? ? ? ? ? ? ? "nian jing yinhang??to tong??zhou dian zi said:i Am your father.測試空格前后匹配? ? a? ???ha!" & @CRLF & _? ? ? ? ? ? ? ? ? ? ? ? "abc123??ABC123??zhou dian zi said:i am your father.a ha!"Local $Result=StringRegExp($Str,"\bam\b",3);匹配單詞 am ,OK!_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"\b(?i)am\b",3);不區分大小寫匹配單詞 am Am,OK!_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"\w+(?=a)",3);往前預匹配”??單詞中有字母a的前面的內容? ?“,OK!_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"(?<=a)\w+",3);往后預匹配”??單詞中有字母a的后面的內容? ?“,OK!;問題:只想匹配出??ha!??后面的 !? ?? ?該怎么做?_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"ha([^a].*)",3);;利用字符類的排除功能獲得了 ”匹配的ha(不包括ha)后面的-行內容“? ?,又加深了 [^] 與??()??的應用,其實可以這樣理解,如果 ([^a]),那么;就是以匹配的內容ha后的 a 為分割點,捕獲分割點后面的內容---應該是a后面的----一行內容;沒有()將會匹配以??ha (包括ha)開頭的之后的行內容_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"ha[^a].*",3)_ArrayDisplay($Result)Local $Result=StringRegExp($Str,".*(?=ha)",3)_ArrayDisplay($Result);匹配 ha 之前的行內容;如果把 .*??改成 \w+ 就只能匹配單詞中有ha部分的前面的內容了,差距咋這么大呢?一不小心頭就大!!!Local $Result=StringRegExp($Str,".*(?=一直在陽痿)",3)_ArrayDisplay($Result)Local $Result=StringRegExp($Str,"(?<=一直在陽痿).*",3)_ArrayDisplay($Result)Local $result=StringRegExp($Str,"ni(?!i)",3)_ArrayDisplay($result)Local $result=StringRegExp($Str,"(?<![a-z])\d{3}",3);匹配不是以26個小寫字母開頭的3位數字_ArrayDisplay($result)#cs(?<=<(\w+)>).*(?=<\/\1>)??的解釋:匹配不包含屬性的簡單HTML標簽內里的內容#ce;examplp6??懶惰和貪婪模式Local $Str="aabab"Local $result=StringRegExp($Str,"a.*b",3)_ArrayDisplay($result)Local $result=StringRegExp($Str,"a.*?b",3);匹配不是以26個小寫字母開頭的3位數字_ArrayDisplay($result) 復制代碼 |