美文网首页
Lua 正则表达式

Lua 正则表达式

作者: SimanX | 来源:发表于2018-04-19 17:48 被阅读0次
 .        任意字符
%a        字母
%c        控制字符
%d        数字
%l        小写字母
%p        标点字符
%s        空白符
%u        大写字母
%w        字母和数字
%x        十六进制数字
%z        代表0的字符

上面字符类的大写形式表示小写所代表的集合的补集。例如, '%A'非字母的字符: 

特殊字符
'%' 用作特殊字符的转义字符
'%.' 匹配 .
'%%' 匹配字符 '%'

用'[]'匹配字符集中的字符一次
'[%w_]' 匹配字母数字和下划线
'[01]' 匹配二进制数字
'[%[%]]'匹配一对方括号
在'[]'中使用连字符'-'
'%d'    表示 '[0-9]';
'%x'    表示 '[0-9a-fA-F]'
'[0-7]' 表示 '[01234567]'

在'[]'开始处使用 '^' 表示其补集:
'[^0-7]' 匹配任何不是八进制数字的字符;
'[^\n]' 匹配任何非换行符户的字符。
'[^%s]' == '%S'

模式修饰符
  ^ 匹配字符串开头
  $ 匹配字符串结尾

  + 匹配前一字符1次或多次
  * 匹配前一字符0次或多次,最长匹配
  - 匹配前一字符0次或多次,最短匹配
  ? 匹配前一字符0次或1次

查找

string.find(s, pattern [, init [, plain]])

s : 需要进行查找的字符串
pattern : 需要匹配的正则表达式
init : 搜索的起始位置
plain : 默认为false,true时关闭匹配正则模式
将查找目标模板在给定字符串中出现的位置,找到返回起始和结束位置,没找到返回nil

  • 注:find 的第二个参数使用了某种匹配模式, 并且模式串里面带括号,那么表示会“捕捉”括号括起来的模式匹配到的字符串,并且作为返回值,从第三个返回值开始返回所有匹配
print(string.find("hello, world", "%s", 2))
=> 7  7

print(string.find("hello, world", "%s", 8)
=> nil

print(string.find("hello, world", "%s", 0, true)
=> nil

print(string.find("hello, world", " ", 0, true))
=> 7  7

-- 其中%1表示拷贝匹配到的第一个内容,同样的%n来拷贝匹配到的第n个内容
print(string.find("abc \"it's a cat\"", "([\"'])(.-)%1")) 
=> 5  16  "  it's a cat
string.match(s, pattern [, init])

s : 需要进行查找的字符串
pattern : 需要匹配的正则表达式
init : 搜索的起始位置
将查找目标模板在给定字符串中出现的匹配字符,如果没有,返回nil

print(string.match("hello, world", "%S%s%S"))
=> , w

print(string.match("hello, world", "%S%s%S", 8))
=> nil

print(string.match("hello, world", "(hello), world"))
=> hello
注:如果pattern中有用()起来的,那么只返回()中的内容,如果多个括号,返回多个值

print(string.match("hello, world", "(hello), (world)"))
=> hello  world

-- 其中%1表示拷贝匹配到的第一个内容,同样的%n来拷贝匹配到的第n个内容
print(string.match("abc \"it's a cat\"", "([\"'])(.-)%1")) 
=> "  it's a cat
string.gmatch (s, pattern)

s : 需要进行查找的字符串
pattern : 需要匹配的正则表达式
返回一个迭代器函数,每一次调用这个函数,返回一个在字符串s找到的下一个符合pattern描述的子串。

local str = "hello, world"
local iter = string.gmatch(str, "%S")

for w, v in iter do
    print(w)
end

=>
h
e
l
l
o
,
w
o
r
l
d

替换

string.gsub (s, pattern, repl [,m])

s : 需要进行查找的字符串
pattern : 需要匹配的正则表达式
repl : 需要替换成的字符串
[, m] : 只看s的前m个字符
将pattern中匹配到的字符串替换成repl字符串,repl可以是string,也可以是个函数,或是table,如果是函数,就会用捕获的内容作为参数调用该函数,将返回的内容作为替换字符串。如果是table,则用捕获的内容为key去取table的值来作为替换字符串,如果不存在,就不做替换
返回值 : 替换后的字符串, 替换的次数

  • 注:把源字符串当做gsub的第一个参数传入后,方法执行并不会修改源字符串,需要重新赋值接收才能获取到修改后的字符串
local str = "hello, world"
print(string.gsub(str, "hello", "hi"))
=> hi, world  1

local str = "hello, world"
print(string.gsub(str, ".", function(pattern)
  if pattern == "l" then
    return "abc"
  end
  return pattern
end))
=> heabcabco, worabcd      12

function expand(s)
     return string.gsub(s, "$(%w+)", _G)
end
name = "Lua"; status = "great"
print(expand("$name is $status, isn't it?"))
=> Lua is great, isn't it?  2

相关文章

网友评论

      本文标题:Lua 正则表达式

      本文链接:https://www.haomeiwen.com/subject/ddawkftx.html