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

时间:2015-03-19 12:36:46

标签: regex lua lua-patterns

我尝试使用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 ]+)\bhttp://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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

就像已经提到的那样,纯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