【问题标题】:Lua variable in pattern match with special characters模式匹配中的 Lua 变量与特殊字符
【发布时间】:2022-01-26 09:57:04
【问题描述】:

当匹配中使用来自正则表达式的值中具有特殊字符的变量时,我遇到了模式匹配问题。

代码:

in_pic_file = 'C:\\Users\\marcus.LAPTOP-01\\RAW\\2021\\20211031\\20211031-_R4_1301.tif'
sync_dir_in = 'C:\\Users\\marcus.LAPTOP-01\\RAW'


in_pic_file_strip = string.match( in_pic_file, ''..sync_dir_in..'(.+)\\' )

print ( in_pic_file_strip )

我想要的结果是 \2021\20211031 但我总是得到零。当我建议 LAPTOP_01 而不是 aof LAPTOP-01 时,j 会得到预期的结果。显然 - singn 被解释为一个正则表达式命令。但是我该如何抑制呢?

【问题讨论】:

    标签: lua lua-patterns


    【解决方案1】:

    - 是一个魔术字符(零个或多个,最短匹配)。如果你想匹配-,你需要用%转义它。

    . 相同(任何字符)。但是. 不会破坏你的比赛。它只允许使用任何字符,而不是您要查找的 .

    所以不是

    sync_dir_in = 'C:\\Users\\marcus.LAPTOP-01\\RAW'
    

    你需要使用

    sync_dir_in = 'C:\\Users\\marcus%.LAPTOP%-01\\RAW'
    

    Lua 5.4 Reference Manual 6.4.1 Patterns

    %x:(其中 x 是任何非字母数字字符)表示 字符 x。这是逃脱魔法角色的标准方法。 任何非字母数字字符(包括所有标点符号、 即使是非魔法)也可以在前面加上一个 '%' 来表示它自己 一个模式。

    允许我们编写一个简单的辅助函数来转义文字模式中的任何非字母数字字符。

    function escape_magic(pattern)
    
      return (pattern:gsub("%W", "%%%1"))
    
    end
    
    
    in_pic_file = 'C:\\Users\\marcus.LAPTOP-01\\RAW\\2021\\20211031\\20211031-_R4_1301.tif'
    sync_dir_in = 'C:\\Users\\marcus.LAPTOP-01\\RAW'
    
    
    in_pic_file_strip = string.match( in_pic_file, ''..escape_magic(sync_dir_in)..'(.+)\\' )
    
    print ( in_pic_file_strip )
    

    【讨论】:

    • 感谢您的提示。有没有办法通过命令保护这些魔法字符。在每个魔法字符前面添加 % 的东西?因为这两个变量的值都取决于用户操作。
    • 查看编辑以方便地逃脱魔术字符
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 2011-03-29
    • 2021-06-11
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多