如何lua if string.findd Lua中的方括号字符

77722人阅读
Lua 笔记(5)
原文链接:
函数原型&string.find(s, pattern [, init [, plain]] )
&s: 源字符串
&pattern: 待搜索模式串
&init: 可选, 起始位置
&plain: 我没用过
&① 子串匹配:
print(string.find(&haha&, 'ah') )
----- 输出 2 3
&注意: lua 里面数组或者字符串的字符, 其下标索引是从 1 开始, 不是 0
&&string.find 默认情况下返回两个值, 即查找到的子串的 起止下标, 如果不存在匹配返回 nil。
&如果我们只想要 string.find 返回的第二个值, 可以使用 虚变量(即 下划线)
_, q=string.find(&haha&, 'ah')
----- 输出 3
&② 模式匹配:
pair = & name = Anna &
print(string.find(pair, &(%a+)%s*=%s*(%a+)&) ---- 输出 2 12 name Anna
&如果 find 的第二个参数使用了某种匹配模式, 并且模式串里面带括号。 那么表示会“捕捉”括号括起来的模式匹配到的字符串。 捕捉, 当然会把他们作为返回值。这里捕捉了两下, 所以 find 多返回了两个值
&那么, 这个模式是怎么匹配的呢?
&Lua 支持的字符类有:
&.&&任意字符
&%s&空白符
&%c&控制字符
&%x&十六进制数
&%z&代表0的字符
&%l&小写字母
&%u&大写字母
&%w&字母数字
字符类的大写形式代表相应集合的补集, 比如 %A 表示除了字母以外的字符集
另外,* + - 三个,作为通配符分别表示:
*: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更长的符合条件的字串
+: 匹配前面指定的 1 或多个同类字符, 尽可能匹配更长的符合条件的字串
-: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更短的符合条件的字串
于是, &(%a+)%s*=%s*(%a+)& 表示, 先匹配一个或多个字母, 然后是零个或多个空白符(比如空格), 然后是个 '=', 然后空白符, 然后字母。这样, 满足匹配的只有 &name = Anna&。 所以输出位置为 2&12.
因为捕获了两个 (%a+), 也就是 name, Anna 这两个单词, 所以还输出了这两个单词
另外, lua 使用 %1-%9 表示拷贝捕获。举例说:
s=&abc \&it's a cat\&&
_,_,_,q=string.find(s, &([\&'])(.-)%1&)
-----输出: it's a cat
首先, [\&'] 表示匹配 双引号或者单引号, 因为有括号,所以引号被捕获。 然后匹配几个任意字符并且捕获他, 最后 %1 匹配与第一次捕获到的(即引号)相同的字串。所以整个模式匹配到的是 &it's a cat&, 而第二次捕获的是去掉两头引号的字串, 即 it's a cat.
还有, '-' 与 '*' 到底有什么不同呢? 在上面, &([\&'])(.*)%1& 匹配到的结果与 '-' 是一样的。尽可能匹配更长, 尽可能匹配更短 究竟什么不同呢?看例子:
print( (&\&hello\& \&hello\&&):find('&(.+)&') )
----输出 1 15 hello& &hello
print( (&\&hello\& \&hello\&&):find('&(.-)&') )
----输出 1 7 hello
* 尽可能长, 所以匹配了首尾两个 引号, 捕获了中间的 (hello& &hello)
- 尽可能短, 所以碰到第二个引号就说匹配完了, 因此只捕获了第一个 (hello)
原文链接:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:299641次
积分:2082
积分:2082
排名:第14205名
原创:32篇
评论:34条
(6)(16)(16)Lua学习笔记之字符串及模式匹配 - Appleegig - 推酷
Lua学习笔记之字符串及模式匹配 - Appleegig
字符类基础函数举例介绍:
string.len( ‘string’ )
string.lower( ‘string’ )
string.upper( ‘string’ )
string.rep( ‘a’ , 5 )
string.sub( ‘string’ , I , j )
string.sub( s, string.find(s, 'world') )
string.sub函数会提取子串by子串所在字符串的位置下标
string.char()
string.byte()
string.format( ‘%02d:%02d:%02d’ , d , m , y )
模式匹配(pattern-matching)函数举例介绍:
字符串=&被查找的字符串
子串=&要查找的字符(串)
string.find( 'string', 'substr' )
返回 子串的前后位置
string.find( 'string', 'c' )
返回相同位置
string.find( s, 'substr', index ) 该函数的第三个参数是开始查找下标
由此,find函数简单查找子串(包含字符) 返回值是2个值;没有找到,即返回nil。
string.match()函数返回匹配到的子串的一份copy。
string.match( 'string' , '%d+/%d+%d+') --&12/23/34
string.gsub( 'Lua is cute', 'cute', 'great' )
--&Lua is great
用第三个参数替换第一个参数中所有出现的第二个参数,并返回整串以及发生的实际替换次数。
string.gsub( 'all lla' , 'l' , 'x' , 3 ) --&axx xla 第四个参数限制替换的次数
string.gmatch(s, '%a') 将返回一个函数,遍历到所有的模式指定子串by返回的函数。
words = {}
for w in string.gmatch( s, &%a+& ) do
words[#words+1] = w
各模式匹配函数的基本简单功能
`find( 'string' , 'strsub' , index )`
从起始位置(index)查找子串返回位置
`match( 'string' , '%s%d.....' )`
匹配捕获,返回子串的copy
`gmatch( 'string', '%s%d' )`
全局匹配捕获,返回一个函数提供所有子串
`gsub( 'string' , 'go' , 'come' , count)`
替换字符串中所有go子串换count次
其实,差不多是根据函数返回值不同,则大约功能相差,参数排布相似,并且都是遍历查找功能。那么上面大致的三类就涵盖了模式匹配3个大的功能方面:查找,捕获,替换。
模式们(基础元素)
模式就是一种字符串,模式函数会解释它们,它们就有了意义
字符分类:(字符,即一个)分类字符们的大写表示相对补集
%c(控制字符) %l(小写字母)
%s(空白字符)
%u(大写字母)
%w( a | d )
%x(十六进制数字)
特殊字符们: (
普通字符串,用来转义: ‘\n’
模式函数解释模式串: 模式中的 特殊字符们需要使用原字符意义用%转义。
但是,尝试了一下这种情况:
string.find( s , ‘^[+-]?%d+$’ )
依然能够匹配出字符串前面的+-号,当然
string.find( s,‘[%+%-]?%d+’)
也能够匹配出结果。所以,建议使用后者,含义比较清晰。
字符集: [%w_]
[AEIOUaeiou]
[0-9A-Fa-f]
描述模式的重复和可选:
重复1次以上
重复随便几次
捕获 “( )”
string.match
会将所有捕获到的值返回
date = “Today is 12/12/2012”
d , m , y = string.match( date, “(%d+)/(%d+)/(%d+)”)
%d 用来匹配与前面第d个捕获相同内容,不仅是字符个数相同。
q,quotedPart = string.match( s , “([\”’])(.-)%1”)
%1的地方必须要与前面([\”’])相同的内容来填补%1此位置。
s = string.gsub(s , “\\(%a+){(.-)}” , “&%1&&%2&&\%1&” )
%d此占位捕获前面位置内容的项,也可以用在替换函数中。
trim ( s )
return ( string.gsub( s , “^%s
$” , “%1” ) )
string.gsub
函数的第三个参数不仅是替换的字符串,还可以是一个table , 或者是一个函数。
table: gsub
每次找到匹配字符串时,以此字符串作为key,用table中对应的value来替换,没有对应value,不替换。
string.gsub( s , “$(%w+)” , _G )
_G是全局变量的table
每次找到匹配字符串时,调用该函数并将匹配字符串作为参数传入。
string.gsub( s , “$(%w+)” , function(n)
return tostring( _G[n] )
将login_string长字符串中内容读取到一个table中,去除前面无意义前缀
login_string = &lgn|Puserid=4542379,svrid=qxzh0001,fcm=0,timestamp=,idc=U,origin=,c=0,sign=0d0cc04dd64b4c2e2d9dd6&
--长字符串中前5个字符去掉
kvtable = { }
login_string_std = string.sub(login_string , 6)
-- lua中索引从1开始
--因为长字符串中有字段的内容为空'origin',模式中第二个选用*
for k,v in string.gmatch(login_string_std , &(%a+)=(%w*)&) do
kvtable[k] = v
补充:pairs 与 ipairs
的时候的区别:
首先,说明一下,数组
table(array)
就是 key 为连续数字的table.
那么,简而言之,
是遍历数组的;
是遍历记录table(k,v)的
来遍历table(k,v),将会逐个读取出来,而遍历table(array)也会全部读取出来。
来遍历table(k,v),将会停止在第一个非数字key的地方或者停止在得到的value是nil的地方,而遍历table(array)就顺利全部遍历出来了,返回0。
最后,使用
比较严格,使用
比较宽松。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致Lua判断字符串前缀是否为指定字符的3种方法
在写 lua debugger 的时候,我需要判断一个字符串的前缀是不是 "@" 。
有三个方案:
1.比较直观的是 string.sub(str,1,1) == "@"
2.感觉效率比较高的是 string.byte(str) == 64
3.或者是 string.find(str,"@") == 1
我推荐第三种。(注:在此特定运用环境下。因为用于判定 source 的文件名,大多数情况都是 @ 开头。如果结果为非,则性能较低)
第一方案 string.sub 会在生成子串的时候做一次字符串 hash ,感觉效率会略微低一些。
第二方案效率应该是最好,但是需要记住 @ 的 ascii 码 64 。如果前缀是多个字符也不适用。
性能对比测试:
string.find(sb, "@") == 1&3.671
string.find(sb, "^@") ~= 1&3.735
string.byte(sa) == 64&2.14
string.char(string.byte(sb)) == "@"&4.375
string.sub(sb,1,1) == "@"&2.766
sb[1] == "@"&0.984
要想解决不以@开头时的性能问题,可以改成这样:
string.find(str,"^@") == 1
如果您喜欢本文请分享给您的好友,谢谢!
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)lua 查找字符 string.find() - 推酷
lua 查找字符 string.find()
函数原型&string.find(s, pattern [, init [, plain]] )
&s: 源字符串
&pattern: 待搜索模式串
&init: 可选, 起始位置
&plain: 我没用过
&① 子串匹配:
&view plaincopy
print(string.find(&haha&,&'ah')&)&&-----&输出&2&3&&
&注意: lua 里面数组或者字符串的字符, 其下标索引是从 1 开始, 不是 0
&&string.find 默认情况下返回两个值, 即查找到的子串的 起止下标, 如果不存在匹配返回 nil。
&如果我们只想要 string.find 返回的第二个值, 可以使用&
(即 下划线)
&view plaincopy
_,&q=string.find(&haha&,&'ah')&&
&print(q)&&-----&输出&3&&
&view plaincopy
pair&=&&&name&=&Anna&&&&
&print(string.find(pair,&&(%a+)%s*=%s*(%a+)&)&----&输出&2&12&name&Anna&&
&如果 find 的第二个参数使用了某种匹配模式, 并且模式串里面带括号。 那么表示会“捕捉”括号括起来的模式匹配到的字符串。 捕捉, 当然会把他们作为返回值。这里捕捉了两下, 所以 find 多返回了两个值
&那么, 这个模式是怎么匹配的呢?
&Lua 支持的字符类有:
&.&&任意字符
&%s&空白符
&%c&控制字符
&%x&十六进制数
&%z&代表0的字符
&%l&小写字母
&%u&大写字母
&%w&字母数字
字符类的大写形式代表相应集合的补集, 比如 %A 表示除了字母以外的字符集
另外,* + - 三个,作为通配符分别表示:
*: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更
的符合条件的字串
+: 匹配前面指定的 1 或多个同类字符, 尽可能匹配更
的符合条件的字串
-: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更
的符合条件的字串
于是, &(%a+)%s*=%s*(%a+)& 表示, 先匹配一个或多个字母, 然后是零个或多个空白符(比如空格), 然后是个 '=', 然后空白符, 然后字母。这样, 满足匹配的只有 &name = Anna&。 所以输出位置为 2&12.
因为捕获了两个 (%a+), 也就是 name, Anna 这两个单词, 所以还输出了这两个单词
另外, lua 使用&
%1-%9 表示拷贝捕获
。举例说:
&view plaincopy
s=&abc&\&it's&a&cat\&&&&
_,_,_,q=string.find(s,&&([\&'])(.-)%1&)&&
print(q)&&-----输出:&it's&a&cat&&
首先, [\&'] 表示匹配 双引号或者单引号, 因为有括号,所以引号被捕获。 然后匹配几个任意字符并且捕获他, 最后 %1 匹配与第一次捕获到的(即引号)相同的字串。所以整个模式匹配到的是 &it's a cat&, 而第二次捕获的是去掉两头引号的字串, 即 it's a cat.
还有, '-' 与 '*' 到底有什么不同呢? 在上面, &([\&'])(.*)%1& 匹配到的结果与 '-' 是一样的。尽可能匹配更长, 尽可能匹配更短 究竟什么不同呢?看例子:
&view plaincopy
print(&(&\&hello\&&\&hello\&&):find('&(.+)&')&)&&----输出&1&15&hello&&&hello&&
print(&(&\&hello\&&\&hello\&&):find('&(.-)&')&)&&----输出&1&7&hello&&
* 尽可能长, 所以匹配了首尾两个 引号, 捕获了中间的 (hello& &hello)
- 尽可能短, 所以碰到第二个引号就说匹配完了, 因此只捕获了第一个 (hello)
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 lua中的string.find 的文章

 

随机推荐