Lua:模式匹配及捕获

Lua:模式匹配及捕获

可以将Lua中的”模式“简单地理解为”Lua方言版的正则表达式“。

Lua中使用到“模式”的标准函数
string.find
string.gmatch
string.gsub
string.match

一、Character Class

A character class is used to represent a set of characters.

The following combinations are allowed in describing a character class:

字符 含义
x 表示字符 x 自身,x 不能是 魔法字符 ^ $ ( ) % . [ ] * + - ? 中的一员
. 表示任何字符
%a 表示任何字母
%d 表示任何数字
%w 表示所有字母及数字
%u 表示所有大写字母
%l 表示所有小写字母
%s 表示所有空白字符
%x 表示字符 x, x 是任意非字母或数字的字符,这是对魔法字符转义的标准方法
%c 表示任何控制字符
%g 表示任何除空白符外的可打印字符
%p 表示所有标点符号
%x 表示所有 16 进制数字符号
[set] 表示 set 中所有字符的集合,可包含 %x 的形式
[^set] 表示 set 的补集, 其中 set 如上面的解释

注:
1)
Lua魔法字符有:^ $ ( ) % . [ ] * + - ? 一共十二个字符。
当我们要匹配这十二个字符时,需要对其特殊处理:使用字符%对其转义。

2)
%x可以转义x,其中x可以是魔法字符,也是魔法字符转义标准方法。
比如我需要匹配字符 ^ ,我在模式串中不可以直接写 ^ ,而是要写作:%^。
另外,所有非字母或数字的字符,例如标点符号,都可以用前置一个"%"在模式串中表示自身。

3)
关于[set]和[^set]其实是和正则表达式一样的含义。
例如:

  • [abc]表示字符a、b、c中的任一字符。
  • [0-7]表示数字0-7,即8进制。

4)
所有单个字母表示的类别(%a,%c,等), 若将其字母改为大写,均表示对应的补集。
例如,%S 表示所有非空格的字符。

5)
特别注意:[a-z] 未必等价于 %l 。
如何定义字母、空格、或是其他字符组取决于当前的区域设置。

二、Pattern Item

模式条目 含义
单个字符类 单个字符类(Character Class),匹配该类别中任意单个字符
单个字符类跟一个 * 将匹配零或多个该类的字符,贪婪匹配
单个字符类跟一个 + 将匹配一或更多个该类的字符,贪婪匹配
单个字符类跟一个 - 将匹配零或更多个该类的字符,区别于 *,非贪婪匹配
单个字符类跟一个 ? 将匹配零或一个该类的字符
%n 1<=n<=9 此条目匹配一个等于 n 号捕获物的子串

三、Pattern

模式是模式条目的序列。模式是由模式条目组成的。

在模式最前面加上符号 ‘^’ 将锚定从字符串的开始处做匹配。
在模式最后面加上符号 ‘$’ 将使匹配过程锚定到字符串的结尾。
如果 ‘^’ 和 ‘$’ 出现在其它位置,它们均没有特殊含义,只表示自身。

注:
句子(模式)是由词语(模式条目)组成的。
词语(模式条目)是由单个字符(字符类)组成的。

四、Captures

可以在模式内部用小括号括起一个子模式,这些子模式被称为捕获物。
当匹配成功时,由捕获物匹配到的字符串中的子串被保存起来用于未来的用途。
捕获物以它们左括号的次序来编号。
例如,对于模式 “(a*(.)%w(%s*))” :
第一个子模式是:“a*(.)%w(%s*)”;
第二个子模式是:.;
第三个子模式是:%s。


DEMO

1.匹配纯数字字符串

local str = "1234567890"
local pattern = "^%d*$"
local s, e = string.find(str, pattern)
print(s, e)

2.匹配英文、数字、标点、空格字符串

local str = "test1280 say: hello, jlnu"
local pattern = "^[%w%p ]*$"
local s, e = string.find(str, pattern)
print(s, e)

3.匹配 HTTP URL

local str = "https://blog.csdn.net/test1280"
local pattern = "^https?://[%w%.]*/.*$"
local s, e = string.find(str, pattern)
print(s, e)

4.捕获

local str = "https://blog.csdn.net/test1280"
local pattern = "^((https?)://([%w%.]*)/(.*))$"
local s, e, cap1, cap2, cap3, cap4 = string.find(str, pattern)
print(s, e)
print(cap1)
print(cap2)
print(cap3)
print(cap4)

5.捕获

local str2 = "position: ( 3, 4 )"
local str3 = "position: ( 3 , 4)"
local strs =
{
        "position: (1, 10)",
        "position: (2 ,20)",
        "position: (3 ,30 )",
        "position: ( 4,40 )"
}
local pattern = ".*(%([ ]*(%d*)[ ]*,[ ]*(%d*)[ ]*%)).*"
for i = 1, #strs do
        print("---")
        local s, e, cap1, cap2, cap3 = string.find(strs[i], pattern)
        print(s, e, cap1, cap2, cap3)
end

参考资料:
1.http://www.runoob.com/manual/lua53doc/manual.html#6.4.1
2.http://manual.luaer.cn/
3.http://www.lua.org/manual/

你可能感兴趣的:(LUA,lua,string.find,regex,pattern,模式匹配)