我有这种模式:
^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
答案 0 :(得分:3)
角色
%
可以作为这些魔法角色的逃脱。
此外,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_]]')
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
,您可以安全地使用%z
(IDEONE demo to check the difference between the two expressions)(参见@moteus noted in his comment }):
的角色
%z
代表0