【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