ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

lua string匹配模式

2021-11-13 23:32:52  阅读:185  来源: 互联网

标签:匹配 string -- assert lua gmatch itr


【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

 

标签:匹配,string,--,assert,lua,gmatch,itr
来源: https://www.cnblogs.com/sailJs/p/15550167.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有