Lua变量在带特殊字符的模式匹配中的使用

我在模式匹配中遇到了问题,当在匹配中使用带有特殊字符值的变量时。

代码:

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 ,但我总是得到nil。当我建议使用LAPTOP_01而不是LAPTOP-01时,我得到了预期的结果。显然“-”符号被解释为正则表达式命令。但我该如何抑制这种情况?

原文链接 https://stackoverflow.com/questions/70495415

点赞
stackoverflow用户2858170
stackoverflow用户2858170

-是一个特殊字符(零个或多个,最短匹配)。如果要匹配 -,需要用 % 对其进行转义。

对于 .(任何字符),也是一样的。但是 . 不会破坏你的匹配。它只允许任何字符代替你要查找的 .

因此,你需要使用以下这种方式:

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

而不是

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

Lua 5.4 参考手册 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 )
2021-12-27 12:44:25