设置动态模式匹配器的方法

请查看这个问题 Pattern ^u.meta(\.|$) not working as expected,它具有我需要的预期行为。

更改

在模式 ^u.meta(\.|$) 或在 lua 中的 '^u%.meta%f[\0.]''^u%.meta%f[%z.]' 中,我需要的更改是 u.meta 可以是用户从变量定义的任何内容。模式应该是通用/动态的,以匹配变量中设置的内容。

例如:

-- 应返回 'u.meta',并且模式应该匹配
local pattern = 'u.meta'
print(string.match("u.meta.admin", '^u%.meta%f[\0.]')) -- u.meta

-- 应返回 'nil',并且模式应该失败
local pattern = 'u.meta'
print(string.match("u.domain.admin", '^u%.meta%f[\0.]')) -- nil

-- 应返回 'anything.anything',并且模式应该匹配
local pattern = 'anything.anything'
print(string.match("anything.anything.something", '^anything%.anything%f[\0.]') -- anything.anything

-- 应返回 nil,并且模式应该失败
local pattern = 'anything.anything'
print(string.match("fake.fake.something", '^anything%.anything%f[\0.]') -- nil

解决方法 1

因此,我想到了类似于 lua 模式中的 插值,如果可能的话。

"^#{pattern}%f[\0.]"

工作解决方案 2

我已经用方法的帮助使它工作。但是我仍然不得不手动调用那些模式。如果我们可以从模式本身解决这个问题,那就太好了。

例如:

function pattern_matcher(v, pattern) return string.match(v, pattern) end

print(pattern_matcher("fake.fake.something", '^u%.meta%f[%z.]')) -- nil
print(pattern_matcher("u.meta.something", '^u%.meta%f[%z.]')) -- u.meta
print(pattern_matcher("u.meta_something", '^u%.meta%f[%z.]')) -- nil
print(pattern_matcher("u.meta-something", '^u%.meta%f[%z.]')) -- nil
点赞
用户3832970
用户3832970

如果需要将用户输入作为正则表达式模式的一部分进行支持,则需要引入转义函数,以便所有特殊字符使用进行转义。然后,只需与自定义边界(^表示字符串的开始,%f%[%z.]表示字符串的结尾或点)进行连接。

function escape (s)
      return string.gsub(s, '[.*+?^$()[%%-]', "%%%0")
end
function pattern_matcher(v, pattern) return string.match(v, pattern) end

word = "u.meta"
print(pattern_matcher("u.meta.something", '^' .. escape(word) .. '%f[%z.]')) -- u.meta

请参见 此演示

escape函数中,替换模式中的前两个%%表示一个 %0反映了整个匹配(即一个特殊字符)。

2016-01-27 11:50:57