aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 18512|回复: 4

一些模式匹配的示例(加深对模式匹配语法的理解)

[复制链接]

52

主题

1272

回帖

7276

积分

荣誉会员

积分
7276
发表于 2011-1-18 01:20:19 | 显示全部楼层 |阅读模式
本帖最后由 qqmmcc 于 2011-1-18 01:20 编辑

摘录论坛一些模式匹配提问,加深对帮助说明的理解

1.
io.open()
str="abcabc123"
\\(abc)捕获组匹配abc,(\1 引用第一捕获组abc ,\d+匹配数字123,如果去掉“+”则只匹配一个数字)
paten="(abc)(\1\d+)"
var m,m2=string.match(str,paten)
io.print(m,m2)

paten1="(abc)"
paten2="(\d+)"
paten3="\1"

m=string.match(str,paten1)
io.print(m)
m=string.match(str,paten2)
io.print(m)
m,m2=string.match(str,paten1++paten2)
io.print(m,m2)


模式串就可以用变量表示,用++连接


2.
清除字符串内部多余空格
io.open()
var str = string.replace("a b c d","\s","");
io.print(str); //输出abcd


3.
想把前面的数字和.去掉,还有把后面的-Winamp去掉

io.open()
str="714. 蝎子乐队 - Hurricane 2000 - Winamp"


\\“^\d+\.”表示字符串从数字开始至.处去掉,用(.*?)捕获组非贪婪匹配捕获任何字符,()括号外的匹配排除不取
str=string.match (str, "^\d+\.(.*?) - Winamp" )
io.print(str)


4.
%对称匹配 要放在单引号''内

io.open()
str = 'a = 1a(b)cd2 ' //字符串如果包含双引号则应放在单引号中

//'%12'表示从1开始至2结尾包含的字符匹配
str2 = string.match(str, '%12')
io.print(str2); //显示 1a(b)cd2

//中文是两个字节,要这样写 %<中><文>
str = 'a = 中a(b)cd文 '
str2 = string.match(str, '%<中><文>')
io.print(str2); //显示 中a(b)cd文


5.
邮箱匹配

io.open();
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,}") {
    io.print(m)
}
//io.print(email)
execute("pause");
io.close();


6.
io.open()

a="123456789
987654321"


\\ “\N*” 表示不是任意个换行符
m = string.match(a,"\N*") //等价于 m = string.match(a,"[^\n]*")
io.print( m )  //显示123456789



7.
在模式匹配中,可以使用"<@@忽略大小写部分@>"指定一个忽略大小写的文本比较
io.open();//打开控制台

html =
"<sPan>A</span>"

//使用%语法匹配配对的HTML标记(忽略大小写,最短匹配)
str = string.replace(html,"%<\<[sS][pP][aA][nN][^>]*><\</[sS][pP][aA][nN]\>>?","替换后")
io.print(
"替换结果" ,str );

//这个简单些,忽略大小写的文本比较,最短匹配,不过这个没有考虑对称嵌套的情况
//在串匹配中,用两个@@指定一个忽略大小写的文本比较
str = string.replace(html,"<@@<span@>.*\>(.+?)<@@</span>@>","<div>\1</div>")
io.print(
"替换结果" ,str );

execute("pause") //按任意键继续
io.close();//关闭控制台


8.捕获分组应用,并支持中文

io.open();//打开控制台

str =
'<DIV class=Page_s_box><DIV class="pags F_wide">共225020条,每页500条1/451页</DIV><UL class=Pag_num><LI class=now>'

io.print(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,"<\<[^\>]+\>>")

io.open()
io.print(str2)//显示<html>

inerHtml = "<html><body><center><font color=#21B929>aardio,编程的能手</font></body></html>"

io.open()
while(inerHtml){
    tag,inerHtml = string.match(inerHtml,
"\<(\w+)(.+)\</\1\>")
    io.print( tag,inerHtml );
   
}



10.希望匹配到“下一页”前面最近的<a 惰性匹配

io.open();//打开控制台

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*\=[^<]+?下一页" )
io.print(str)

execute("pause") //按任意键继续
io.close();//关闭控制台



11.
/*str中的括号两边有空格我想要s1=苹果 s2=个 s3=0.50 都不带空格   ()为全角的括号*/

io.open();//打开控制台


var str = //苹果 (个) 0.50

//捕获分组用法,全角的()可以直接()表示

p="(<:>+)\s+((:))\s+([\d\.]+)"
s1,s2,s3 = string.match(str,p);
io.print(s1,s2,s3)

execute("pause") //按任意键继续
io.close();//关闭控制台




在论坛提问,有个好处就是可以让后来者学习需要的知识,在此谢谢提问及解答的朋友,也感谢分享学习心得的朋友,整理这份例子只是为了加深理解帮助里面提及的知识,但无论怎么整理,都不及自己在实践中磕碰出来的知识印象深刻难忘,很赞同老大说的一句话“实践中嗑碰出来的知识,如流水无形,无一定之规”,每个人学习方法都不同,根据自己实际情况学习就好了,动手练习却是非常重要的。

10

主题

161

回帖

1005

积分

四级会员

男人,表里如一

积分
1005
QQ
发表于 2011-1-18 22:48:10 | 显示全部楼层
打个水印,以后再CC

7

主题

293

回帖

1900

积分

新手入门

积分
1900
QQ
发表于 2011-1-19 18:17:57 | 显示全部楼层
留个记号,方便以后查找。

23

主题

381

回帖

2240

积分

五级会员

积分
2240
发表于 2011-1-19 23:21:14 | 显示全部楼层
感谢版主的整理,留个记号。

12

主题

39

回帖

369

积分

新手入门

积分
369
发表于 2017-2-18 22:53:11 | 显示全部楼层
不错
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-7-18 03:43 , Processed in 0.059715 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表