2015-03-19 2 views
1

Я пытаюсь сопоставить строку в формате domain \ username с помощью 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.

+1

Lua не поддерживает обычные выражения. lua использует [шаблоны] (http://www.lua.org/manual/5.1/manual.html#5.4.1). Если вам нужны регулярные выражения, вам нужна библиотека для них. –

+0

, вы можете рассмотреть возможность использования [lpeg] (http://www.inf.puc-rio.br/~roberto/lpeg/). – dualed

ответ

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)) 

Последний пример не заканчивается; ,. или пробелы. Если он должен следовать этому, то просто удалить окончательный? из образец.

UPDATE: Если в домене (например, 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 
3

Lua pattern не является регулярным выражением, поэтому ваше регулярное выражение не работает.

  • \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.

+0

Он не получает доменное имя должным образом для abc.domain.org \ user1, он дает только домен org user1 в качестве выходного – Namitha

 Смежные вопросы

  • Нет связанных вопросов^_^