lua 正则表达式

--[[
.(): 与任何字符配对
%a: 与任何字母配对
%c: 与任何控制符配对(例如\n)
%d: 与任何数字配对
%l: 与任何小写字母配对
%p: 与任何标点(punctuation)配对
%s: 与空白字符配对
%u: 与任何大写字母配对
%w: 与任何字母/数字配对
%x: 与任何十六进制数配对
%z: 与任何代表0的字符配对
%x(此处x是非字母非数字字符): 与字符x配对. 主要用来处理表达式中有功能的字符(^$()%.[]*+-?)的配对问题, 例如%%%配对
[数个字符类]: 与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对

	+ 匹配前一字符1次或多次
	* 匹配前一字符0次或多次
	- 匹配前一字符0次或多次
	? 匹配前一字符0次或1%' 用作特殊字符的转义字符,因此 '%.' 匹配点;'%%' 匹配字符 '%'。转义字符 '%'不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义他。

链接:https://www.jianshu.com/p/f4a17bf3bb9e

string.find(字符串查找)
string.gsub(全局字符串替换)
string.gfind(全局字符串查找)
string.gmatch(返回查找到字符串的迭代器)

]]

-- string.gmatch(str, pattern)  返回一个迭代器函数

local s = "hello world from Lua"
for w in string.gmatch(s,"%a+") do
	print(w)
end

local s1 = "hello=123 123=hello"
for w,s in string.gmatch(s1,"(%d+)=(%a+)") do
	print(w,s)
end


--[[
string.gsub(str, pattern, repl, n)

string.gsub()函数根据给定的配对表达式对源字符串str进行配对, 同时返回源字符串的一个副本, 该副本中成功配对的所有子字符串都将被替换. 
函数还将返回成功配对的次数.实际的替换行为由repl参数的类型决定:

当repl为字符串时, 所有成功配对的子字符串均会被替换成指定的repl字串.

当repl为table时, 对每个成功配对的子字符串, 函数均会试图寻找以其为key值的table中的元素, 并返回该元素. 
如果该配对包含任何捕获信息, 则以编号为1号的捕获作为key值进行查找.

当repl为函数时, 每个成功配对的子字符串均会作为参数被传入到该函数中去.

在repl是table时, 如果该table返回了字串或数字的值, 这个值依然会被用于替换副本字串中的配对子字串. 
如果该table/函数返回的值为空, 将不发生替换.

n参数可选, 当它被指定时, string.gsub()函数只对源字符串中的前n个成功配对的成员进行操作.
	
]]

--当repl为字符串时
--当只匹配一个字符串时
local s2 = "hello world"
print(string.gsub(s2,"(%w+)","%1 %1")) --这里每次只会匹配到一个字符串 所以替换成 两个一样的字符 
print(string.gsub(s2,"(%w+)","%1+%1+%1")) --扩展

--当匹配两个字符串时
print(string.gsub(s2,"(%w+)%s*(%w+)","%2+%1")) --每次匹配到两个字符串 替换成%2+%1 %2是第二个字符串  %1是第一个字符串

--当repl为函数时
string.gsub(s2, "%w+", function ( word ) --返回一个参数
	print(word)
end)

string.gsub(s2,"(%w+)%s*(%w+)",function ( word1,word2 ) --返回两个参数
	-- print(string.len(word1),string.len(word2))
	print(word1,word2)
end)

--当repl为table时
local temp = {
	hello = "hi",
	-- world = "city"
}
print(string.gsub(s2,"(%w+)",temp))


--[[
	string.match(str, pattern, init)
	string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1.

在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil.
]]

print(string.match(s2,"(%w+)",1))
print(string.match("hessss","he%w+",1))


--[[
string.find(str, pattern, init, plain)

string.find的基本应用就是用来在目标串(subject string)内搜索匹配指定的模式的串。
函数如果找到匹配的串返回他的位置,否则返回nil.最简单的模式就是一个单词,仅仅匹配单词本身。
比如,模式'hello'仅仅匹配目标串中的"hello"。当查找到模式的时候,函数返回两个值:匹配串开始索引和结束索引
]]

print(string.find(s2,"e%w+"))

-- string.find(s, "hello")    --> 1    5
-- string.find(s, "world")    --> 7    11
-- string.find(s, "l")        --> 3    3
-- string.find(s, "lll")      --> nil

local pos1 = 1
--循环查找
while true do
	pos1,pos2 = string.find("hello hello","e%w+",pos1)
	-- print(pos1,pos2)
	if not pos1 then break end
	pos1 = pos2 + 1
end

--[[
string.sub(str,sPos,ePos)

string.gsub的功能是截取字符串,他从指定起始位置截取一个字符串。string.sub可以利用string.find返回的值截取匹配的子串。
对简单模式而言,匹配的就是其本身

]]
-- s = "hello world"
local i, j = string.find(s2, "hello")    --> 1    5
print(string.sub(s, i, j))        --> hello
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值