Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4765802
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类: 系统运维

2011-01-22 00:58:57




参考 余晟的正则视频课程,将课程的例子用模式匹配练习,同时学习正则及模式匹配知识,顺便了解二者的区别。此贴仅是我学习的记录过程,日后我再整理一份完整的模式匹配学习资料。

一。字符组(正则)
1.1 []意味着匹配指定一组字符中的一个
正则最基本结构之一,作用是规定某个位置能够出现的字符,形式是以[...]给出,在方括号[...]内列出字符。
使用方括号 [... ] 包含一系列字符,能够匹配其中任意一个字符。虽然可以是任意一个,但只能是一个。


如 
[0123456789]去匹配一个字符组{"1";"2";"3";"4";"5";"6";"7";"8";"9";"0";"x"},匹配结果是{"1";"2";"3";"4";"5";"6";"7";"8";"9";"0"}都成功的,除了x不符合。


1.2 连字符"-"字符组支持由连字符“-”来表示一个范围。

当“-”前后构成范围时,要求前面字符的码位小于后面字符的码位

如上面[0123456789]可以简化写成[0-9]或[0123-9]...表示0-9所有字符。


[0123456789] = [0-9]

[0-789] = [0-9]

[0123456789abcdef] = [0-9a-f]


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

str = table.tostring({"1";"2";"3";"4";"5";"6";"7";"8";"9";"0";"x"})

pattern = "[0123456789]"//也可表示[0-9]或[0123-9]

//遍历字符组,逐个匹配出来
for str in string.gmatch(str ,pattern) { 
io.print(str)//显示 1234567890 ,x不符合匹配范围没显示出来



io.print(string.match(str,pattern))//显示1,匹配[0123456789]其中一个成功。

注意:在字符组内部,连字符若在方括号内的最前面,则是匹配“-”符号,如[-123]是匹配“-”、“1”、“2”“3”其中一个,,此时就不是连字符了,只有当连字符出现在两个字符之间时,才能表示字符的范围。


示例2

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

str = table.tostring({"a";"b";"c";"d";"e";"f";"g";"-"})

pattern1 = 
"[a-g]"
pattern2 = 
"[-ag]"//或[ag-]

for str in string.gmatch(str ,pattern1) { 
    io.print(str)//显示abcdefg,匹配[a-g]



io.print(
'\n')

for str in string.gmatch(str ,pattern2) { 
    io.print(str)//显示ag-,匹配[-ag]或[ag-](快手语言“-”放在最后面,但一般放在前面是规范写法)

}

1.3[^排除型字符组。(模式匹配称“补集”)作用:规定某个位置不容许出现的字符,形式以[^...]给出,在方括号内列出不容许出现的字符。

排除型字符组表示任意一个未列出的字符,同样只能是一个。排除型字符组同样支持由连字符“-”来表示一个范围。


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

str = table.
tostring({"1";"2";"3";"4";"5";"6";"7";"8";"9";"0";"a";"b";"c";"d";"e";"f"})

pattern1 = 
"[0-5]"//匹配0-5的任一字符

pattern2 = 
"\w&[^0-5]"//只匹配字母数字及除0-5外的字符

//pattern3 ="[^0-5]" 在快手里用此模式会匹配符号"";{}出来,不会辩别字符组格式

for str in string.gmatch(str ,pattern1) { 
        io.print(str)
}


for str in string.gmatch(str ,pattern2) { 
        io.print(str)
}

[]在模式匹配中是用来创建自定义的字符类,匹配其中之一的字符,同正则。

1.4字符组简记法(常见6种)

[\d] = [0-9] 任意一个数字,即0-9中任意一个
[\D] = [^0-9] 任意一个非数字字符

[\w] = [0-9a-zA-Z_] 任意一个数字或字母或下划线(模式匹配不包括下划线)
[\W] = [^0-9a-zA-Z_] 

[\s] 匹配空白字符 [\r\n\f\t\v](包括匹配回车、换行、制表、空格)
[\S] 匹配非空白字符

示例 4

1.5 特殊的简记法 - 点号点号“ .” 可以匹配几乎所有字符,但不能匹配换行符(特殊模式下可以匹配换行符,模式匹配可匹配换行符)
“\.” 加上转义符“\”则匹配点号“.”本身, 点号在方括号内[.]也是匹配点号本身
示例 5

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

str = table.
tostring({"a";"A";"0";"$";"(";"."})

pattern1 = 
"."// 匹配所有字符

pattern2 = 
"\."//仅匹配点号本身

pattern3 =
"[.]" //仅匹配点号本身



for str in string.gmatch(str ,pattern1) { 
        io.print(str)
}


for str in string.gmatch(str ,pattern2) { 
        io.print(str)
}

for str in string.gmatch(str ,pattern3) { 
        io.print(str)
}

阅读(1908) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~