Lua Pattern для извлечения / замены значения в / / - PullRequest
1 голос
/ 03 сентября 2010

У меня есть строка вроде hello /world today/

Мне нужно заменить /world today/ на /MY NEW STRING/

Чтение руководства, которое я нашел

newString = string.match("hello /world today/","%b//")

, который я могу использовать с gsub для замены, но мне было интересно, есть ли также элегантный способ вернуть только текст между /, я знаю, что могу просто обрезать его, но мне было интересно, был ли шаблон .

1 Ответ

2 голосов
/ 03 сентября 2010

Попробуйте что-то вроде одного из следующих:

  • slashed_text = string.match("hello /world today/", "/([^/]*)/")
  • slashed_text = string.match("hello /world today/", "/(.-)/")
  • slashed_text = string.match("hello /world today/", "/(.*)/")

Это работает, потому что string.match возвращает любые захваты из шаблона или весь сопоставленный текст, если нет захватов. Ключевым моментом является то, чтобы убедиться, что шаблон обладает нужной степенью жадности, помня, что шаблоны Lua не являются полным языком регулярных выражений.

Первые два должны совпадать с одинаковыми текстами. Во-первых, я явно требовал, чтобы шаблон соответствовал как можно большему количеству не косых черт. Второе (спасибо lhf) соответствует кратчайшему из всех символов, за которым следует косая черта. Третий - жадный, он соответствует самому длинному диапазону символов, за которым может следовать косая черта.

%b// в исходном вопросе не имеет никаких преимуществ перед /.-/, так как два разделителя имеют одинаковый символ.

Редактировать: Добавлен шаблон, предложенный lhf, и дополнительные пояснения.

...