【问题标题】:Capture group in Lua pattern matches literal digit character instead of capture groupLua 模式中的捕获组匹配文字数字字符而不是捕获组
【发布时间】:2017-01-08 22:38:17
【问题描述】:

我想提取包含key="VALUE" 的行的VALUE,我正在尝试使用一个简单的Lua 模式来解决这个问题。

它适用于那些在 VALUE 中包含文字 1 的行除外。模式解析器似乎将我的捕获组混淆为转义序列。

> return  string.find('... key = "PHONE2" ...', 'key%s*=%s*(["\'])([^%1]-)%1')
5       18      "       PHONE2
> return  string.find('... key = "PHONE1" ...', 'key%s*=%s*(["\'])([^%1]-)%1')
nil
>

【问题讨论】:

    标签: lua string-matching lua-patterns


    【解决方案1】:

    您根本不需要使用[^%1]。只需使用.-,因为根据定义,它匹配尽可能小的字符串。

    此外,您可以使用多行字符串语法,而不必转义模式中的引号:

    > s=[[... key = "PHONE1" ...]]
    > return s:find [[key%s*=%s*(["'])(.-)%1]]
    5       18      "       PHONE1
    

    [^%1] 模式实际上意味着,不要单独搜索字符 %1

    【讨论】:

    • 谢谢。我还发现我会逃避 1 以强制它在集合中包含捕获组。 [^%\1]您的解决方案更有意义且更清洁。我会用的。
    • @nolan 在这种情况下,您只想使用[^\1]% 字符不是必需的。
    • 确实不是。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2014-11-20
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多