Попытка сопоставить строку в формате домен\имя пользователя с помощью Lua, а затем замаскировать шаблон с помощью «#»

Я пытаюсь сопоставить строку в формате домен\имя пользователя, используя Lua, а затем маскировать шаблон с помощью #.

Таким образом, если на входе 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.


person Namitha    schedule 19.03.2015    source источник
comment
lua не поддерживает регулярные выражения. lua использует шаблоны. Если вам нужны регулярные выражения, вам нужна библиотека для них.   -  person Etan Reisner    schedule 19.03.2015
comment
вы можете использовать для этого lpeg.   -  person dualed    schedule 20.03.2015


Ответы (2)


Как уже упоминалось, в чистом 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
person tonypdmtr    schedule 20.03.2015

Шаблон 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.sub или string.gsub.

person Yu Hao    schedule 19.03.2015
comment
Он не получает правильно доменное имя для abc.domain.org\user1, он дает только домен org user1 в качестве вывода - person Namitha; 20.03.2015