尝试使用 Lua 匹配 domain\username 格式的字符串,然后用“#”屏蔽该模式
Trying to match a string in the format of domain\username using Lua and then mask the pattern with '#'
我正在尝试使用 Lua 匹配 domain\username 格式的字符串,然后使用 #
.
屏蔽该模式
所以如果输入是 sample.com\admin;
,输出应该是 ######.###\#####;
。字符串可以以 ;
、,
、.
或空格结尾。
更多示例:
sample.net\user1,hello -> ######.###\#####,hello
test.org\testuser. Next -> ####.###\########. Next
我尝试了 ([a-zA-Z][a-zA-Z0-9.-]+)\.?([a-zA-Z0-9]+)\([a-zA-Z0-9 ]+)\b
,它与 http://regexr.com/ 完美搭配。但是对于 Lua 演示,它没有。模式有什么问题?
下面是我用来签入的代码 Lua:
test_text="I have the 123 name as domain.com\admin as 172.19.202.52 the credentials"
pattern="([a-zA-Z][a-zA-Z0-9.-]+).?([a-zA-Z0-9]+)\([a-zA-Z0-9 ]+)\b"
res=string.match(test_text,pattern)
print (res)
正在打印nil
。
Lua 模式不是正则表达式,这就是您的正则表达式不起作用的原因。
不支持 \b
,如果需要,您可以使用更强大的 %f
边界模式。
- 在字符串
test_text
中,\
没有被转义,所以被解释为\a
。
.
是patterns中的魔法字符,需要转义
此代码与您的模式不完全相同,如果需要您可以修改它:
test_text = "I have the 123 name as domain.com\admin as 172.19.202.52 the credentials"
pattern = "(%a%w+)%.?(%w+)\([%w]+)"
print(string.match(test_text,pattern))
输出:domain com admin
固定模式后,将它们替换为 #
的任务很容易,您可能需要 string.sub
或 string.gsub
。
就像已经提到的那样,纯 Lua 没有正则表达式,只有模式。
但是,您的正则表达式可以与以下代码和模式匹配:
--[[
sample.net\user1,hello -> ######.###\#####,hello
test.org\testuser. Next -> ####.###\########. Next
]]
s1 = [[sample.net\user1,hello]]
s2 = [[test.org\testuser. Next]]
s3 = [[abc.domain.org\user1]]
function mask_domain(s)
s = s:gsub('(%a[%a%d%.%-]-)%.?([%a%d]+)\([%a%d]+)([%;%,%.%s]?)',
function(a,b,c,d)
return ('#'):rep(#a)..'.'..('#'):rep(#b)..'\'..('#'):rep(#c)..d
end)
return s
end
print(s1,'=>',mask_domain(s1))
print(s2,'=>',mask_domain(s2))
print(s3,'=>',mask_domain(s3))
最后一个例子没有以;结尾,.或空格。如果它必须遵循这个,那么只需删除最后的 ?来自模式。
更新:如果在域中(例如 abc.domain.org),您还需要显示最后一个点之前的任何点,您可以用这个函数替换上面的函数:
function mask_domain(s)
s = s:gsub('(%a[%a%d%.%-]-)%.?([%a%d]+)\([%a%d]+)([%;%,%.%s]?)',
function(a,b,c,d)
a = a:gsub('[^%.]','#')
return a..'.'..('#'):rep(#b)..'\'..('#'):rep(#c)..d
end)
return s
end
我正在尝试使用 Lua 匹配 domain\username 格式的字符串,然后使用 #
.
所以如果输入是 sample.com\admin;
,输出应该是 ######.###\#####;
。字符串可以以 ;
、,
、.
或空格结尾。
更多示例:
sample.net\user1,hello -> ######.###\#####,hello
test.org\testuser. Next -> ####.###\########. Next
我尝试了 ([a-zA-Z][a-zA-Z0-9.-]+)\.?([a-zA-Z0-9]+)\([a-zA-Z0-9 ]+)\b
,它与 http://regexr.com/ 完美搭配。但是对于 Lua 演示,它没有。模式有什么问题?
下面是我用来签入的代码 Lua:
test_text="I have the 123 name as domain.com\admin as 172.19.202.52 the credentials"
pattern="([a-zA-Z][a-zA-Z0-9.-]+).?([a-zA-Z0-9]+)\([a-zA-Z0-9 ]+)\b"
res=string.match(test_text,pattern)
print (res)
正在打印nil
。
Lua 模式不是正则表达式,这就是您的正则表达式不起作用的原因。
-
不支持
\b
,如果需要,您可以使用更强大的%f
边界模式。- 在字符串
test_text
中,\
没有被转义,所以被解释为\a
。 .
是patterns中的魔法字符,需要转义
此代码与您的模式不完全相同,如果需要您可以修改它:
test_text = "I have the 123 name as domain.com\admin as 172.19.202.52 the credentials"
pattern = "(%a%w+)%.?(%w+)\([%w]+)"
print(string.match(test_text,pattern))
输出:domain com admin
固定模式后,将它们替换为 #
的任务很容易,您可能需要 string.sub
或 string.gsub
。
就像已经提到的那样,纯 Lua 没有正则表达式,只有模式。 但是,您的正则表达式可以与以下代码和模式匹配:
--[[
sample.net\user1,hello -> ######.###\#####,hello
test.org\testuser. Next -> ####.###\########. Next
]]
s1 = [[sample.net\user1,hello]]
s2 = [[test.org\testuser. Next]]
s3 = [[abc.domain.org\user1]]
function mask_domain(s)
s = s:gsub('(%a[%a%d%.%-]-)%.?([%a%d]+)\([%a%d]+)([%;%,%.%s]?)',
function(a,b,c,d)
return ('#'):rep(#a)..'.'..('#'):rep(#b)..'\'..('#'):rep(#c)..d
end)
return s
end
print(s1,'=>',mask_domain(s1))
print(s2,'=>',mask_domain(s2))
print(s3,'=>',mask_domain(s3))
最后一个例子没有以;结尾,.或空格。如果它必须遵循这个,那么只需删除最后的 ?来自模式。
更新:如果在域中(例如 abc.domain.org),您还需要显示最后一个点之前的任何点,您可以用这个函数替换上面的函数:
function mask_domain(s)
s = s:gsub('(%a[%a%d%.%-]-)%.?([%a%d]+)\([%a%d]+)([%;%,%.%s]?)',
function(a,b,c,d)
a = a:gsub('[^%.]','#')
return a..'.'..('#'):rep(#b)..'\'..('#'):rep(#c)..d
end)
return s
end