|
本帖最后由 qqmmcc 于 2011-1-18 01:20 编辑
摘录论坛一些模式匹配提问,加深对帮助说明的理解
1.
import console
str="abcabc123"
\\(abc)捕获组匹配abc,(\1 引用第一捕获组abc ,\d+匹配数字123,如果去掉“+”则只匹配一个数字)
paten="(abc)(\1\d+)"
var m,m2=string.match(str,paten)
console.log(m,m2)
paten1="(abc)"
paten2="(\d+)"
paten3="\1"
m=string.match(str,paten1)
console.log(m)
m=string.match(str,paten2)
console.log(m)
m,m2=string.match(str,paten1++paten2)
console.log(m,m2)
模式串就可以用变量表示,用++连接
2.
清除字符串内部多余空格
import console
var str = string.replace("a b c d","\s","");
console.log(str); //输出abcd
3.
想把前面的数字和.去掉,还有把后面的-Winamp去掉
import console
str="714. 蝎子乐队 - Hurricane 2000 - Winamp"
\\“^\d+\.”表示字符串从数字开始至.处去掉,用(.*?)捕获组非贪婪匹配捕获任何字符,()括号外的匹配排除不取
str=string.match (str, "^\d+\.(.*?) - Winamp" )
console.log(str)
4.
%对称匹配 要放在单引号''内
import console
str = 'a = 1a(b)cd2 ' //字符串如果包含双引号则应放在单引号中
//'%12'表示从1开始至2结尾包含的字符匹配
str2 = string.match(str, '%12')
console.log(str2); //显示 1a(b)cd2
//中文是两个字节,要这样写 %<中><文>
str = 'a = 中a(b)cd文 '
str2 = string.match(str, '%<中><文>')
console.log(str2); //显示 中a(b)cd文
5.
邮箱匹配
import console;
str1="邮箱:abcdefg+1@gmail.com 网站:google"
str2="邮箱:abcde_fg@gmail.com 网站:google"
str3="邮箱:abcdefg.@gmail.com 网站:google"
str4="邮箱:abcdef-g.@gmail.com 网站:google"
tab = {}
table.push(tab,str1,str2,str3,str4)
/*
email=string.match(str,"\w+[\w\_\p\.]+\w*?@\w+[\w\-\.]+\w{2,}")
\w+ 匹配字母数字1次到多次
[\w\_\p\.]+ 匹配字母数字 下划线 符号 圆点号其中之一
\w*? 匹配@之前的字符 非贪婪匹配
\w+[\w\-\.]+\w{2,} 匹配主机域名
*/
for m,m2,m3 in string.gmatch(table.tostring(tab),"\w+[\w\_\p\.]+@\w+[\w\-\.]+\w{2,}") {
console.log(m)
}
//console.log(email)
console.pause();
;
6.
import console
a="123456789
987654321"
\\ “\N*” 表示不是任意个换行符
m = string.match(a,"\N*") //等价于 m = string.match(a,"[^\n]*")
console.log( m ) //显示123456789
7.
在模式匹配中,可以使用"<@@忽略大小写部分@>"指定一个忽略大小写的文本比较
import console;//打开控制台
html ="<sPan>A</span>"
//使用%语法匹配配对的HTML标记(忽略大小写,最短匹配)
str = string.replace(html,"%<\<[sS][pP][aA][nN][^>]*><\</[sS][pP][aA][nN]\>>?","替换后")
console.log("替换结果" ,str );
//这个简单些,忽略大小写的文本比较,最短匹配,不过这个没有考虑对称嵌套的情况
//在串匹配中,用两个@@指定一个忽略大小写的文本比较
str = string.replace(html,"<@@<span@>.*\>(.+?)<@@</span>@>","<div>\1</div>")
console.log("替换结果" ,str );
execute("pause") //按任意键继续
;//关闭控制台
8.捕获分组应用,并支持中文
import console;//打开控制台
str = '<DIV class=Page_s_box><DIV class="pags F_wide">共225020条,每页500条1/451页</DIV><UL class=Pag_num><LI class=now>'
console.log(string.match(str,"共(\d*)条,每页500条(\d*)/(\d*)页"))//显示 225020 1 454
9.在串匹配中,+或*都是极度贪婪匹配,不是一般的贪婪,所以.+是直接到字符串尾部。
str = "<html><body><center><font color=#21B929>aardio,编程的能手</font></body></html>"
// "[^\>]+\>" 意思应当是所有非>字符到>字符
str2 = string.match(str,"<\<[^\>]+\>>")
import console
console.log(str2)//显示<html>
inerHtml = "<html><body><center><font color=#21B929>aardio,编程的能手</font></body></html>"
import console
while(inerHtml){
tag,inerHtml = string.match(inerHtml,"\<(\w+)(.+)\</\1\>")
console.log( tag,inerHtml );
}
10.希望匹配到“下一页”前面最近的<a 惰性匹配
import console;//打开控制台
html = /*
<div class="pg"><strong>1</strong><a href="http://bbs.aardio.com/thread-382-2-1.html">2</a><a href="http://bbs.aardio.com/thread-382-3-1.html">3</a><a href="http://bbs.aardio.com/thread-382-4-1.html">4</a><a href="http://bbs.aardio.com/thread-382-5-1.html">5</a><a href="http://bbs.aardio.com/thread-382-2-1.html" class="nxt">下一页</a></div>
*/
str = string.match( html, "\<a href\s*\=[^<]+?下一页" )
console.log(str)
execute("pause") //按任意键继续
;//关闭控制台
11.
/*str中的括号两边有空格我想要s1=苹果 s2=个 s3=0.50 都不带空格 ()为全角的括号*/
import console;//打开控制台
var str = //苹果 (个) 0.50
//捕获分组用法,全角的()可以直接()表示
p="(<:>+)\s+((:))\s+([\d\.]+)"
s1,s2,s3 = string.match(str,p);
console.log(s1,s2,s3)
execute("pause") //按任意键继续
;//关闭控制台
在论坛提问,有个好处就是可以让后来者学习需要的知识,在此谢谢提问及解答的朋友,也感谢分享学习心得的朋友,整理这份例子只是为了加深理解帮助里面提及的知识,但无论怎么整理,都不及自己在实践中磕碰出来的知识印象深刻难忘,很赞同老大说的一句话“实践中嗑碰出来的知识,如流水无形,无一定之规”,每个人学习方法都不同,根据自己实际情况学习就好了,动手练习却是非常重要的。 |
|