lua string匹配模式

【lua的匹配模式可以看做是功能不完整的正则表达式,只实现了大部分】

使用过程中,遇到的不支持的功能:

# 分组匹配多次, 比如: abcabc, 无法用(abc)+匹配到

# 匹配次数范围, 比如: a{1,3}这种, 最少匹配1次,最多匹配3次

 

【可以使用匹配模式的函数】

# string.find, 查找匹配字符串的开始和结束位置, 未找到就返回nil

# string.gsub, 替换

# string.match, 返回第1个匹配的字符串

# string.gmatch, 返回所有匹配字符串的迭代器

 

 1 local function TestMatch()
 2     --匹配开始
 3     assert("a" == string.match("abc123", "^a"))
 4     assert(nil == string.match("1abc23", "^a"))
 5     assert("a" == string.match("aaa123", "^a"))
 6 
 7     assert(1,1 == string.find("abc123", "^a"))
 8     assert(nil == string.find("1abc23", "^a"))
 9     assert(1,1 == string.find("aaa123", "^a"))
10 
11     --匹配结束
12     assert("3" == string.match("abc123", "3$"))
13     assert(nil == string.match("abc123d", "3$"))
14     assert("3" == string.match("abc333", "3$"))
15 
16     --匹配0个或多个, 贪婪(匹配尽可能多)
17     local itr = string.gmatch("baababb", "a*")
18     assert("" == itr())
19     assert("aa" == itr())
20     assert("" == itr()) --b:0个
21     assert("a" == itr())
22     assert("" == itr())
23     assert("" == itr()) --b:0个
24     assert("" == itr()) --b:0个
25 
26     --匹配0个或多个, 非贪婪(匹配尽可能少)
27     itr = string.gmatch("baababb", "a-")
28     assert("" == itr())
29     assert("" == itr())
30     assert("" == itr())
31     assert("" == itr())
32     assert("" == itr())
33     assert("" == itr())
34     assert("" == itr())
35     assert("" == itr())
36 
37     --匹配1个或多个
38     itr = string.gmatch("baababb", "a+")
39     assert("aa" == itr())
40     assert("a" == itr())
41 
42     --[]中的任何一个
43     itr = string.gmatch("aabb1122cc", "[ab12]*")
44     assert("aabb1122" == itr())
45     assert("" == itr())
46     assert("" == itr())
47     assert("" == itr())
48 
49     itr = string.gmatch("abc123", "[ab12]*")
50     assert("ab" == itr())
51     assert("" == itr())
52     assert("12" == itr())
53     assert("" == itr())
54     assert("" == itr())
55 
56     itr = string.gmatch("1234", "[123]*")
57     assert("123" == itr())
58     assert("" == itr())
59     assert("" == itr())
60 
61     itr = string.gmatch("1234", "[1-3]*")
62     assert("123" == itr())
63     assert("" == itr())
64     assert("" == itr())
65 
66     --不是数字就匹配
67     itr = string.gmatch("12abc12", "[^0-9]*")
68     assert("" == itr())
69     assert("" == itr())
70     assert("abc" == itr())
71     assert("" == itr())
72     assert("" == itr())
73 end
74 TestMatch()
75 
76 local function TestPatternReplace()
77     assert("b111" == string.gsub("aaa111", "a+", "b"))
78     
79     --引用pattern中的分组
80     assert("111_aaa" == string.gsub("aaa111", "(a+)(1+)", "%2_%1"))
81 end
82 TestPatternReplace()

 

【扩展trim功能】

 1 function string.ltrim(str)
 2     return string.gsub(str, "^%s*(.-)", "%1")
 3 end
 4 
 5 function string.rtrim(str)
 6     return string.gsub(str, "(.-)%s*$", "%1")
 7 end
 8 
 9 function string.trim(str)
10     return string.gsub(str, "^%s*(.-)%s*$", "%1")
11 end

 

【参考】

https://www.it1352.com/1582661.html

http://www.cnitblog.com/kenlistian/archive/2008/10/15/50292.html

 

上一篇:Android中级第十二讲项目架构配置


下一篇:C++实现INI文件读写