Lua 模式中的变量与特殊字符匹配

Lua variable in pattern match with special characters

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

代码:

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 )

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

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

转义

.(任意字符)相同。但是 . 不会中断你的比赛。它只允许任何字符而不是您要查找的 .

所以不用

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: (where x is any non-alphanumeric character) represents the character x. This is the standard way to escape the magic characters. Any non-alphanumeric character (including all punctuation characters, even the non-magical) can be preceded by a '%' to represent itself in a pattern.

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

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 )