程序员

Lua string patterns

2016-08-21  本文已影响425人  AlbertS
匹配夏日模式.png

前言#

今天是我每天一篇技术总结计划的第60天,也就是说我坚持每天一篇技术总结已经整整两个月了,我先给自己点个赞。今天也正好是lua函数中string家族里讲解完结的一章,在这一段时间中我们经常会在章节中听到模式匹配这个词,这也是string库函数的强大之处。

Lua并不使用POSIX规范的正则表达式来进行模式匹配。主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lua标准库加在一起都大。权衡之下,Lua中的模式匹配的实现只用了500行代码,当然这意味着不可能实现POSIX所规范的所有功能。但是Lua中的模式匹配功能也是很强大的,并且包含了一些使用标准POSIX模式匹配不容易实现的功能。

前面几章一直跟大家说会总结一下模式匹配这一块的内容,今天是周末我就利用多一点时间,根据lua官方文档中关于模式的介绍为主线,我们一起来总结一下lua中关于模式匹配的内容,其中大部分内容官方文档已经介绍过了,我就是翻译一下,可能有理解不正确的地方,欢迎大家批评指正。

内容#


string patterns##


1.Character Class
一个字符类可以被用于表示一组字符,以下组合被允许来来描述一个字符类:


2.Pattern Item
一个模式选项可以是:


3.Pattern

模式是一系列的模式项。在模式开头的^将匹配固定在源串的开头。在模式结尾的$将匹配固定在源串的结尾。在其他位置上,^$没有特殊含义,表示它们自身。


4.Captures

模式可以含有括在圆括号内的子模式,它们描述捕获。当成功进行一个匹配,源串中匹配捕获的子串被存储(捕获)以便将来使用。捕获根据它们的左圆括号进行编号。例如,在模式"(a*(.)%w(%s*))"中,字符串的匹配"a*(.)%w(%s*)"的部分作为第一个捕获被存储(因此被编号为1),匹配"."的字符被捕获并编号为2,匹配"%s*"的部分被编号为3。

作为一种特殊情况,空捕获()捕获当前字符串位置(一个数字)。例如,如果我们把模式()aa()用于字符串"flaaap",将有两个捕获:3和5。

模式不能含有内嵌的0(即'\0')。使用%z代替。


usage##

-- 这是一个原串
local sourcestr = "ehrt999wj=--=-*-/4mdqwl\0ds123tfef"
print("\nsourcestr = "..string.format("%q",sourcestr));

-- '%z'的使用
local match_ret = string.match(sourcestr, "%z")
print("\n%z match_ret is ", string.format("%q",match_ret))

-- '*'的使用
match_ret = string.match(sourcestr, "%a*")
print("\n%a* match_ret is ", string.format("%q",match_ret))

-- '-'的使用(其实我有点迷糊)
match_ret = string.match(sourcestr, "%a%d-")
print("\n%a- match_ret is ", string.format("%q",match_ret))

-- '%bxy'的使用
match_ret = string.match(sourcestr, "%bhs")
print("\n%bhs match_ret is ", string.format("%q",match_ret))

-- '()xxx()'的使用
local match_ret1, match_ret2 = string.match(sourcestr, "()t9()")
print("\n()t9() match_ret is ", string.format("%q",match_ret1), 
    string.format("%q",match_ret2))
string_pattern.png

总结#

上一篇 下一篇

猜你喜欢

热点阅读