Lua REGEX, поймать скобки - PullRequest
       24

Lua REGEX, поймать скобки

0 голосов
/ 01 марта 2020

Как поймать значения (r = 32, g = 36, b = 51) из этих данных выше?

$color1: rgba(32, 36, 51, 1);

Я пытаюсь:

v = "$color1: rgba(32, 36, 51, 1);"
id, r, g, b = v.match(v, "%$color(%d+)%:%s+rgba%((%d+)%,%s+(%d+)%,%s+(%d+)%,%s+%d+%)%;") or 0, 0, 0, 0

Но не работает .

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Ваша строка id, r, g, b = v.match(v, "%$color(%d+)%:%s+rgba%((%d+)%,%s+(%d+)%,%s+(%d+)%,%s+%d+%)%;") or 0, 0, 0, 0 анализируется Lua как

id = v:match(pattern) or 0
r = 0
g = 0
b = 0

Так как есть совпадение, переменная id установлена ​​на значение группы захвата 1, остальным присваиваются нули .

Вы можете исправить это назначение, используя таблицы:

result = {string.match(v, "%$color(%d+):%s+rgba%((%d+),%s+(%d+),%s+(%d+),%s+%d+%);")}
id, r, g, b = result[1] or 0, result[2] or 0, result[3] or 0, result[4] or 0

См. Lua demo .

ПРИМЕЧАНИЕ : ; и , не являются специальными символами Lua, поэтому я удалил экранированные символы % перед ними в шаблоне.

0 голосов
/ 01 марта 2020
v = "$color1: rgba(32, 36, 51, 1);"
string.gsub(v, "%((%d+),%s(%d+),%s(%d+)", function(r, g, b) print(r, g, b) end)

Вывод: 32 36 51

Gsub находит вхождения шаблона в строке и либо заменяет текст на текст, либо в этом случае запускает функцию. Я начинаю свой паттерн с %(, потому что я предполагаю, что вы будете запускать эту функцию только для строки, которая всегда выглядит как та, которую вы дали, поэтому не может быть ложных срабатываний, так что это будет довольно безопасно просто начать с первой открывающей скобки. Каждый %d+ находит один или несколько di git, и он заключен в скобки, чтобы функция могла найти его позже. ,%s находит запятую и пробел между цифрами.

function(r, g, b) действует там, где r, g и b - первый, второй и третий набор, найденные в скобках.

...