Справочное руководство по языку Lua 5.1 :: 5.4 - Обработка таблиц



5.4 – Работа со строками

Библиотека предоставляет основные функции для работы со строками, такие как поиск и выделение подстрок, а также поиск по шаблону. Строки в Lua индексируются с 1 (а не 0, как в C). Индексы могут быть отрицательными и интерпретируются как индекс с конца строки. Т.е. последний символ имеет позицию -1, и т.д.

Библиотека работы со строками предоставляет все функции в таблице string. Она также устанавливает поле __index метатаблицы строк на таблицу string. Также, Вы можете использовать строковые функции в объектно-ориентированном стиле. Например, string.byte(s, i) может быть записано как s:byte(i).


string.byte (s [, i [, j]])

Возвращает числовые коды символов s[i], s[i+1], ···, s[j]. По умолчанию значение для i равно 1; по умолчанию значение для j равно i.

Напоминаем, что числовые коды символов не одинаковы на разных платформах.


string.char (···)

Принимает 0 или более целых чисел. Возвращает строку, длина которой равна количеству параметров, и каждый элемент строки установлен равным соответствующему параметру.

Напоминаем, что числовые коды символов не одинаковы на разных платформах.


string.dump (function)

Возвращает строку, содержащую двоичное представление данной функции function, так, что если после этого вызвать функциюloadstring на эту строку, мы получим копию функции. function должна быть Lua функцией без внешних локальных переменных (upvalues).


string.find (s, pattern [, init [, plain]])

Ищет первое вхождение шаблона pattern в строку s. Если поиск успешен, то find возвращает индексы s где найдено совпадение с шаблоном, т.е. где начинается и кончается; иначе возвращает nil. Третий, необязательный числовой параметр init указывает откуда начинать поиск; по умолчанию он равен 1, также он может быть отрицательным. Значение true в четвертом, необязательном параметре plain выключает возможность поиска по шаблону, в этом случае производится поиск подстроки как есть, т.е. считается, что она не содержит «шаблонных» ("magic") симолов. Помните, что если указан параметр plain, то параметр init должен быть указан тоже.

Если шаблон содержит захваты (captures) и поиск успешен, то захваченные значения также возвращаются, сразу после двух индексов.


string.format (formatstring, ···)

Возвращает параметры, передаваемые в функцию, отформатированные в соответствии первым параметром (который должен быть строкой). Строка формата должна строиться по тем же правилам, что и строка формата для семейства C функций printf. Отличие только в том, что опции/модификаторы *, l, L, n, p и h не поддерживаются, а также не поддерживается опция q. Опция q позволяет вернуть строку в формате, безопасно воспринимаемом Lua интерпретатором: строка выводится в двойных кавычках, а все двойные кавычки, перевод строки, символы с кодом 0 и обратный слеш внутри строки перекодируются (escaped). Например, вызов


        string.format('%q', 'a string with "quotes" and \n new line')
       

будет возвращать строку:

       
          "a string with \"quotes\" and \

           new line"
          

Опции c, d, E, e, f, g, G, i, o, u, X и x должны использоваться только для числовых параметров, а q и s - строковых.

Эта функция не принимает строковые параметры, содержащие символы с кодом 0, кроме параметров для формата, имеющего опцию q.


string.gmatch (s, pattern)

Возвращает итератор, который, при каждом вызове, возвращает следующее захваченное значение. Если шаблон pattern не содержит захватов (captures), то простое сравнение будет выполнено при каждом вызове.

Например,следующий цикл

          
     s = "hello world from Lua"

     for w in string.gmatch(s, "%a+") do

       print(w)

     end
   

будет проходить по всем словам в строке s, печатая их по одному в строке. Следующий пример собирает все парные ключи (pairs key)=value из указанной строки в таблицу:

   
         t = {}

         s = "from=world, to=Lua"

            for k, v in string.gmatch(s, "(%w+)=(%w+)") do

            t[k] = v

         end
         

Для данной функции, символ '^' в начале шаблона не работает как признак поиска с начала строки, поскольку это помешает итерации.


string.gsub (s, pattern, repl [, n])

Возвращает копию s в которой все вхождения pattern заменяются на repl, который может быть строкой, таблицей или функцией. gsub также возвращает как второе значение – общеее количество проведенных подстановок.

Если repl строка, то используется ее значение для замены. Символ % работает как символ со специальным назначением: любая последовательность в repl в виде %n, где n от 1 до 9, заменяется на n-ную захваченную подстроку (см. ниже). Последовательность %0 заменяется на найденную подстроку. Последовательность %% считается как одиночный символ %.

Если repl является таблицей, то она запрашивается для каждого сравнения, с использованием первого захваченного значения как ключ; если шаблон не содержит захватов, то используется результат простого сравнения как ключ.

Если repl является функцией, то эта функция вызывается каждый раз, когда обнаруживается совпадение. В качестве параметров ей передаются все захваченные подстроки; если шаблон не содержит захватов (captures), то передается результат сравнения как один параметр.

Если значение, возвращаемое таблицей или функцией является строкой или числом, то это значение используется для замены; в противном случае, если значение равно false или nil, то замена не производится (т.е. найденное значение остается без замены).

Необязательный последний параметр n ограничивает максимальное количество замен. Например, если n равно 1, то будет выполнено не более одной замены.

Несколько примеров

         
    x = string.gsub("hello world", "(%w+)", "%1 %1")
     --> x="hello hello world world"
     

     x = string.gsub("hello world", "%w+", "%0 %0", 1)
     --> x="hello hello world"
     

     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
     --> x="world hello Lua from"
     

     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
     --> x="home = /home/roberto, user = roberto"
     

     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
           return loadstring(s)()
         end)
     --> x="4+5 = 9"
     

     local t = {name="lua", version="5.1"}
     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
     --> x="lua-5.1.tar.gz"
 

string.len (s)

Возвращает длину строки, переданной в качестве параметра. Пустая строка "" имеет длину 0. Вложенные символы с кодом 0 также считаются как символ, т.е. "a\000bc\000" имеет длину 5.


string.lower (s)

Возвращает копию строки s, где все большие буквы заменены на маленькие. Все остальные символы остаются неизменными. Понятие «большие буквы» зависит от текущей кодовой страницы.


string.match (s, pattern [, init])

Поиск первого вхождения шаблона pattern в строку s. В случае обнаружения, match возвращает захваченные значения (captures); в противном случае возвращает nil. Если pattern не содержит захватов, то производится простое сравнение. Третий, необязательный числовой параметр init указывает с какого символа строки необходимо начинать поиск; по умолчанию этот параметр равен 1. Также он может быть отрицательным.


string.rep (s, n)

Возвращает строку, в которой содержится n копий строки s.


string.reverse (s)

Возвращает строку, в которой символы строки s расположены в обратном порядке.


string.sub (s, i [, j])

Возвращает подстроку строки s, которая начинается с символа с индексом i и продолжается до символа с индексом j; i и j могут быть отрицательными. Если j не указан, то считается, что он равен -1 (то же самое, что длина строки). В частности, вызов string.sub(s,1,j) возвращает начальную часть строки с длиной j, а string.sub(s, -i) возвращает конец строки s длиной i.


string.upper (s)

Принимает строку и возвращает копию этой строки, где все маленькие буквы меняются на большие. Все остальные остаются неизменными. Понятие «маленькие буквы» зависит от текущей кодовой страницы.