尝试使用Lua匹配格式为domain\username的字符串,然后用#掩盖该模式。

我正在尝试使用 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

点赞
用户1009479
用户1009479

Lua 模式不是正则表达式,这就是为什么你的正则表达式不起作用的原因。

  • \b 不支持,如果需要,可以使用更强大的 %f 边界模式。
  • 在字符串 test_text 中,\ 没有被转义,因此被解释为 \a
  • 在模式中,. 是特殊字符,需要转义。

这段代码并不完全等同于你的模式,如果需要,可以进行调整:

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.substring.gsub

2015-03-19 13:25:59
用户3735873
用户3735873

如前所述,纯 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
2015-03-20 23:14:58