• openresty开发系列17--lua中的正则表达式


    与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式[4](也写作regexp)来进行模式匹配。主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lua标准库加在一起都大。权衡之下,Lua中的模式匹配的实现只用了500行代码,当然这意味着不可能实现POSIX所规范的所有更能。然而,Lua中的模式匹配功能是很强大的,并且包含了一些使用标准POSIX模式匹配不容易实现的功能。 Lua正则中的特殊字符(元字符)包括如下几种:( ) . % + - * ?[ ] ^ $ lua正则支持其大写形式,大写形式代表非,即有%A = ^%a,%A表示与任意非字母配对。

    元字符描述表达式实例完整匹配的字串
    字符
    普通字符 除去%.[]()^$*+-?的字符,匹配字符本身 Kana Kana
    . 匹配任意字符 Ka.a Kana
    % 转义字符,改变后一个字符的原有意思。当后面的接的是特殊字符时,将还原特殊字符的原意。%和一些特定的字母组合构成了lua的预定义字符集。%和数字1~9组合表示之前捕获的分组 K%wna
    %%na%%
    (a)n%1
    Kana
    %na%
    ana
    [...] 字符集(字符类)。匹配一个包含于集合内的字符。[...]中的特殊字符将还原其原意,但有下面几种特殊情况
    1. %],%-,%^作为整体表示字符']','-','^'
    2. 预定义字符集作为一个整体表示对应字符集
    3. 当]位于序列的第一个字符时只表示字符']'
    4. 形如[^...],[...-...]有特定的其他含义
    [a%]na
    [%a]na
    [%%a]na
    []]na
    [%]]na
    [a-]na
    %na
    wna
    wna
    ]na
    ]na
    -na
    [...-...] -表示ascii码在它前一个字符到它后一个字符之间的所有字符 [a-z]a na
    [^...] 不在...中的字符集合。 [^0-9]na
    [^^0-9]na
    Kna
    Kna
    重复(数量词)
    * 表示前一个字符出现0次或多次 [0-9]*
    [a-z]*9*
    2009
    na
    + 表示前一个字符出现1次或1次以上 n+[0-9]+ n2009
    ? 表示前一个字符出现0次或1次 n?[0-9]+ 2009
    预定义字符集
    %s 空白符[ vf] an[%s]?9 an 9
    %p 标点符号 an[%p]9 an.9
    %c 控制字符    
    %w 字母数字[a-zA-Z0-9] [%w]+ Kana9
    %a 字母[a-zA-Z] [%a]* Kana
    %l 小写字母[a-z] -
    %u 大写字母[A-Z] -
    %d 数字[0-9] -
    %x 16进制数[0-9a-fA-F] -
    %z ascii码是0的字符 -
    分组
    (...) 表达式中用小括号包围的子字符串为一个分组,分组从左到右(以左括号的位置),组序号从1开始递增。 ab(%d+)
    (%d+)%1
    ab233
    123123
    边界匹配(属于零宽断言)
    ^ 匹配字符串开头 ^(%a)%w* abc123
    $ 匹配字符串结尾 %w*(%d)$ abc123
    %b
    %bxy 平衡匹配(匹配xy对)。这里的x,y可以是任何字符,即使是特殊字符也是原来的含义,匹配到的子串以x开始,以y结束,并且如果从x开始,每遇到x,计算+1,遇到y计数-1,则结束的y是第一个y使得计数等于0。就是匹配成对的符号,常见的如%b()匹配成对的括号 %b()
    %d+%b()
    (3+4(x*2))
    2(3+4(x*2))
  • 相关阅读:
    205. Isomorphic Strings
    8 旋转数组的最小数字
    303. Range Sum Query
    70. Climbing Stairs
    HDU 5971 Wrestling Match (二分图)
    URAL 2019 Pair: normal and paranormal (STL栈)
    URAL 2021 Scarily interesting! (贪心+题意)
    URAL 2018 The Debut Album (DP)
    HDU 5236 Article (概率DP+贪心)
    HDU 5241 Friends (大数)
  • 原文地址:https://www.cnblogs.com/reblue520/p/11429825.html
Copyright © 2020-2023  润新知