2015-03-24 2 views
1

Мне нужна помощь с Lua и регулярным выражением, чтобы решить следующую проблему. Я получил много строк в следующем формате:Заменить строку регулярным выражением

"|keynameN=value" 

Он может содержать несколько пробелов между вертикальной чертой (|) и «» обозначением. Кроме того, он может содержать несколько пробелов между именем и символом равенства (=).

  1. "|house10=true"
  2. "|car11 = house"
  3. "| name = car"
  4. "| wow15 = cat"

мне нужно использовать string.gsub() функции пропускания регулярного выражения, которое динамически заменяет только имя каждого ключа (house10, car11, name, wow15) с моими собственными, консервантами его номера суффиксов и без изменения формата строк (например, сохраняя пространства). Я уже пробовал много комбинаций, но не добился успеха.

ответ

2

Я бы сказал, что

new_string = string.gsub(old_string, "^(| *)[A-Za-z]+", "%1prefix", 1) 

где prefix"%1prefix" в это вещь, с которой вы хотите заменить первую часть ключа. , 1 в конце не является абсолютно необходимым, потому что ^ привязывает шаблон в начале строки, но он потенциально позволит gsub сделать меньше работы.

Основной трюк состоит в том, чтобы захватить | и следующие пробелы от входной строки и использовать их (с %1) в замен.

В зависимости от точных форм, которые разрешены ключи, набор допустимых символов может нуждаться в настройке (например, [A-Za-z_], если ключи могут содержать символы подчеркивания). Метод лом должен был бы использовать [^0-9 =] (т. Е. Ничего, кроме цифр, пробелов и =), но я не уверен, что рекомендую его.

Обратите внимание, что Lua patterns не являются регулярными выражениями (и несколько менее мощными).

+0

Большое спасибо за объяснение! –

0

Одно из возможных решений этой функции (см «мой» в примере ниже):

t = { 
    {"|house10=true"   , 'residence'}, 
    {"|car11 = house"   , 'auto'}, 
    {"| name = car"  , 'label'}, 
    {"|  wow15 = cat" , 'owo'}, 
} 

function my(s,myown) 
    s = s:gsub('(|%s*)(%a+)(%d*%s*=%s*%a+)','%1'..myown..'%3') 
    return s 
end 

for _,v in ipairs(t) do 
    print(my(v[1],v[2])) 
end 
Смежные вопросы