正则表达式

在方括号里列出它们就行了,像[…

  • 在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。

  • [0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)

  • 重复单个字符(直接在字符后面加上限定符就行了);

  • 重复多个字符:你可以用小括号来指定子表达式(也叫做分组)

常用分组语法

start_pos, end_pos = string.find(str, pattern, [pos])

string.sub(str,pos1, pos2, [plain]) – str[pos1, pos2]

lua的模式匹配规则
lua字符串的api: string.find string.match string.gmatch string.gsub
捕获

http://rangercyh.blog.51cto.com/1444712/1393067
模式
让我们来看看,都有哪些特殊字符需要解释,其实这一部分在Lua的官方文档中,介绍的还是很清楚的:
首先,任何单独的字符,除了上面那些特殊字符外,都代表他们本身。注意前提是他们独立出现。
其次,Lua定义了一些集合,它们分别如下:
. :代表任意的字符。
%a :代表任意字母。
%c :代表任意控制字符。
%d :代表任意数字。
%l :代表任意小写字母。
%p :代表任意标点符号。
%s :代表任意空白字符(比如空格,tab啊)。
%u :代表任意大写字母。
%w :代表任意字母和数字。
%x :代表任意16进制数字。
%z :代表任意跟0相等的字符。
%后面跟任意一个非字母和数字的字符,都代表了这个字符本身,包括上面那些特殊字符以及任何标点符号都可以用这个方式来表达。
[set] :代表一个自定义的字符集合。你可以使用符号 – 来标识一个范围,比如 1-9,a-z 之类的。需要注意的是,上面提到的那些字符集合也可以在这个自定义的集合里用,但是你不能这么写[%a-z],这样的集合是没有意义的。
[^set] :代表字符集合[set]的补集(补集是什么意思,我了个去,问你数学老师去)。
另外,对于上面提到的所有用 % 跟一个字母组成的集合,如果把字母大写,那么就对应那个集合的补集,比如 %S 的意思就是所有非空白字符。Lua官网还强调了一下,这里个定义跟本地的字符集有关,比如集合 [a-z] 就不一定跟 %l 是相等的。
任意一个单字符表达的集合,包括 % 加单字符表达的集合后面都可以跟4种符号,他们分别是 * 、 +、 – 、 ?。
* :意思是前面的集合匹配0个或者更多字符,并且是尽量多的匹配。
+ :意思是前面的集合匹配1个或者更多字符。
– :意思是前面的集合匹配0个或者更多字符,尽量少的匹配。
? :意思是前面的集合匹配0个或者1个。
如下:
1
2
3
4
5
6local a = “ammmf”
print(string.match(a, “%a”)) – a
print(string.match(a, “%a*”)) – ammmf
print(string.match(a, “%a+”)) – ammmf
print(string.match(a, “%a-“)) –
print(string.match(a, “%a?”)) – a

看了上面的例子,你可能会想,那 * 和 + 或者加不加 ? 有什么区别呢?是有区别的,因为匹配0个和匹配1个有的时候就是有没有匹配成功的关键,比如加上 ? 就可以匹配0个,意味着即使没有对应集合的内容,也算匹配成功了,如果有捕获的话,这个时候捕获是生效的。比如:
1
2
3local a = “ammmf”
print(string.match(a, “()c”)) – nil
print(string.match(a, “()c?”)) – 1

如果你现在还不知道 string.match() 是什么意思,就翻到前面去看吧。
还有一个特殊的字符需要介绍,就是 %b 后面跟两个不同的字符xy,它的意思是匹配从x开始,到y结束的字符串,而且要求这个字符串里x和y的数量要相同。比如 %b() 就是匹配正常的小括号,如下:
1
2local a = “aaabb”
print(string.match(a, “%bab”)) – aabb

最后,我在介绍 string.gmatch 的时候介绍过字符 ^ 的用法,它放在模式的首部,意思是从原串的首部就开始匹配,这里还有一个特殊字符跟它的用法类似,它就是 $ 字符,这个字符放在模式的末尾,意思是从原串的尾部开始匹配。在其他位置就跟 ^ 一样,也没有意义。

捕获
捕获的意思在介绍 string.find 的时候已经详细介绍过了,这里再提一笔,捕获是在模式中,用小括号括起来的子模式,它在匹配发生的时候截取小括号内模式匹配到的字符串,然后保存下来,默认最多保存 32 个,可以在Lua源码中修改保存的数量。另外捕获的顺序是按照小括号左括号的位置来定的。至于捕获如何使用,请参看我上面介绍的4个使用了模式的函数的具体用法。

Lua解释器对字符串的支持很有限。一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容。在Lua中操纵字符串的功能基本来自于string库。

  • ngx.re.gmatch使用

    local iter = ngx.re.gmatch(xcode, “([^,]+)”, “jo”)
    if not iter then return end

    while true do
    local v, err = iter()
    if not v then
    break
    end
    ngx.say(“## match v: “, v[0], v[1])
    end

注意 v=iter之后,要求出v[0] == v[1] == “value”, 不能直接使用v

  • ngx.re.match使用

    local m, err = ngx.re.match(“hello, 1234”, “([0-9])[0-9]+”)

    – m[0] == “1234”

    – m[1] == “1”

captures[0] holds the whole substring being matched, and captures[1] holds the first parenthesized sub-pattern’s capturing, captures[2] the second, and so on.

  • ngx.re.find使用

Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。

正则表达式匹配不是find,所以要整体匹配才可以

re.compile(patt, [flag])

pattern编译后也是生成一个对象,有如下属性和方法

re.match

match返回结果是一个对象,有如下的属性和方法集合

match使用

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/5916.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部