模式^ u.meta(\。| $)无法按预期工作

时间:2016-01-26 10:49:11

标签: lua lua-patterns

我有这种模式:

^u.meta(\.|$)

预期行为

^u.meta(\.|$)将匹配以下所有角色:

u.meta
u.meta.admin
u.meta.admin.system
u.meta.*

它应该与下面的内容不匹配:

u.meta_admin
u.meta_admin_system

我已使用https://regex101.com/在线regexp tester测试了此模式。

问题:

我必须使用lua脚本实现此模式。 但得到invalid escape sequence near '\.'

-- lua script

> return  string.match("u.meta.admin", '^u.meta(\.|$)')
stdin:1: invalid escape sequence near '\.'

我尝试添加双\\以及在该正则表达式中删除'\'转义字符,但得到的是nil:

-- lua script

> return string.match("u.meta.admin", '^u.meta(\\.|$)')
nil

> return  string.match("u.meta.admin", '^u.meta(.|$)')
nil

1 个答案:

答案 0 :(得分:3)

请参阅You can find a demo here

  

角色%可以作为这些魔法角色的逃脱。

此外,Lua不支持(...|...)更改。相反,我想,你需要一个单词边界,比如Lua regex docs

  

%f[set],一种前沿模式;这样的项匹配任何位置的空字符串,使得下一个字符属于set,而前一个字符不属于set。集合集如前所述进行解释。处理主题的开头和结尾就好像它们是字符\0

所以,你可以使用

return string.match("u.meta.admin", '^u%.meta%f[%A]')

仅在.

结尾或之前匹配
return string.match("u.meta", '^u%.meta%f[\0.]')

要仅在admin后面没有字母或下划线时匹配,请使用否定字符类[^%a_]

return string.match("u.meta_admin", '^u%.meta%f[[^%a_]]')

请参阅%f[set] frontier pattern

print(string.match("u.meta", '^u%.meta%f[\0.]')) -- u.meta
print(string.match("u.meta.admin", '^u%.meta%f[\0.]')) -- u.meta
print(string.match("u.meta-admin", '^u%.meta%f[\0.]')) -- nil
print(string.match("u.meta", '^u%.meta%f[%A]')) -- u.meta
print(string.match("u.meta.admin", '^u%.meta%f[%A]')) -- u.meta
print(string.match("u.meta-admin", '^u%.meta%f[%A]')) -- u.meta
-- To exclude a match if `u.admin` is followed with `_`:
print(string.match("u.meta_admin", '^u%.meta%f[[^%a_]]')) -- nil

注意要匹配字符串的结尾,而不是\0,您可以安全地使用%zIDEONE demo to check the difference between the two expressions)(参见@moteus noted in his comment }):

  

%z代表0

的角色