Lua как найти символ в строке

Описание

string.find — возвращает позицию подстроки в строке. Для поиска можно использовать регулярные выражения.

Синтаксис

Привязка к окну: нет.

Работа со свернутым окном: да.

Параметры заключаются в скобки и разделяются запятыми.

string.find (<s>, <шаблон> [, стартовая_позиция_поиска [, true])

Или:

<s>:find(<шаблон> [, стартовая_позиция_поиска [, true]])

Где:

s — строка.

шаблон — что искать или регулярное выражение.

стартовая_позиция_поиска — стартовая позиция поиска, по умолчанию 1. Необязательный параметр.

true — если указано производится поиск подстроки как есть. Необязательный параметр.

Поддерживаемые опции регулярных выражений:

.	-- Любой символ
%a	-- Буква (только англ.!)
%A	-- Любая буква (русская), символ, или цифра, кроме английской буквы 
%c	-- Управляющий символ
%d	-- Цифра
%D	-- Любая буква, или символ, кроме цифры
%l	-- Буква в нижней раскладке (только англ.!)
%L	-- Любая буква, символ, или цифра, кроме английской буквы в нижней раскладке
%p	-- Символ пунктуации
%P	-- Любая буква, символ, или цифра, кроме символа пунктуации
%s	-- Символ пробел
%S	-- Любая буква, символ, или цифра, кроме символа пробела
%u	-- Буква в верхней раскладке (только англ.!)
%U	-- Любая буква, символ, или цифра, кроме английской буквы в верхней раскладке
%w	-- Любая буква, или цифра (только англ.!)
%W	-- Любой символ, или буква (русская), кроме английской буквы, или цифры
%x	-- Шестнадцатеричное число
%X	-- Любая буква, или символ,  кроме цифры, или английской буквы, используемой в записи шестнадцатеричного числа 
%z	-- Строковые параметры, содержащие символы с кодом 0

Примеры

--lua
local a = "New York"                        -- строка
local start_pos = string.find(a, "Yo")      -- искать начальную позицию Yo
log (start_pos)
--lua
local a = "New York"                                 -- строка
local start_pos, end_pos = string.find(a, "York")    -- искать начальную и конечную позицию York
log (start_pos, end_pos)
--lua
local a = "New York"                         -- строка
local start_pos, end_pos = a:find("York")    -- альтернативная запись функции 
log (start_pos, end_pos)
--lua
local a = "3 кг яблок и 3 кг груш"           -- строка
local start_pos = a:find("3")                -- найти число 3 в строке
log (start_pos)
start_pos = a:find("3", 2)             -- найти число 3 в строке, начиная со 2й позиции
log (start_pos)

Использование регулярных выражений

--lua
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local start_pos, end_pos = str1:find("%d+")      -- найти позицию первого числа в строке
log(start_pos, end_pos)
--lua
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local start_pos, end_pos, num1 = string.find(str1, "(%d+)")           -- найти позицию первого числа в строке и присвоить переменной num1
log(start_pos, end_pos, num1)
--lua
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local _, _, num1 = string.find(str1, "(%d+)")    -- если позиции не нужны, то можно использовать _(нижнее подчёркивание)
log(num1)
--lua
local str1 = "Координаты: X = 360, Y = 638"      -- строка
local s, e, num1, num2 = string.find(str1, "(%d+), Y = (%d+)")    -- найти координаты X и Y, присвоить переменным num1 и num2
log(num1, num2)
-- или так
str1 = "Координаты: X = 123, Y = 547"      -- строка
s, e, num3, num4 = string.find(str1, "(%d+)[^%d]+(%d+)")    -- [^%d]* - означает любые символы, кроме числа
log(num3, num4)
--lua
log ("clear") log ("mode compact")
local str1 = "С 12:30 до 13:15 обед"      -- строка
local s, e, num1, num2, num3, num4 = str1:find("(%d+)[^%d]+(%d+)[^%d]+(%d+)[^%d]+(%d+)")    -- найти 4 числа, между числами могут присутствовать любые символы
log(num1, num2)
log(num3, num4)

Смотрите также

Tonumber (Lua)

Tostring (Lua)

String.format (Lua)

String.match (Lua)

String.gmatch (Lua)

String.format (Lua)

Qlua-основы
string.byte

S = "Текст";
string.byte(S, i); -- Возвращает числовой код символа в строке по индексу i
   -- i (необязательный параметр) - начальный индекс (по умолчанию, 1)
S:byte(i); -- Эквивалентно
 
string.byte(S, 1); -- Вернет 210
string.byte(S, 2); -- Вернет 229
string.byte(S, 3); -- Вернет 234
string.byte(S, 4); -- Вернет 241
string.byte(S, 5); -- Вернет 242


string.char

string.char(n,...);               -- Возвращает символы по числовым кодам, может принимать любое количество кодов через запятую
string.char(210);                 -- Вернет "Т"
string.char(210,229,234,241,242); -- Вернет "Текст"

string.dump

string.dump(func); -- Возвращает двоичное представление функции func

string.find

-- Ищет вхождение подстроки в строку и возвращает индекс начала вхождения, или nil, если совпадение не найдено
S = "Текст";
string.find(S,"екс"); -- Вернет 2
S:find("екс"); -- Эквивалентно
-- В строке поиска можно использовать регулярные выражения

string.format

-- Выводит отформатированную строку
string.format("quik%scsharp%s", "lua", ".ru"); -- Вернет строку "quikluacsharp.ru"
 
-- Поддерживаемые опции:
%a	-- Шестнадцатеричное в виде 0xh.hhhhp+d (только С99)
%A	-- Шестнадцатеричное в виде 0Xh.hhhhP+d (только С99)
%c	-- Символ по коду
%d	-- Десятичное целое со знаком
%i	-- Десятичное целое со знаком
%e	-- Экспоненциальное представление ('е' на нижнем регистре)
%E	-- Экспоненциальное представление ('Е' на верхнем регистре)
%f	-- Десятичное с плавающей точкой
%g	-- В зависимости от того, какой вывод будет короче, используется %е или %f
%G	-- В зависимости от того, какой вывод будет короче, используется %Е или %F
%o	-- Восьмеричное без знака
%s	-- Строка символов
%u	-- Десятичное целое без знака
%x	-- Шестнадцатеричное без знака (буквы на нижнем регистре)
%X	-- Шестнадцатеричное без знака (буквы на верхнем регистре)
%p	-- Выводит указатель
%n	-- Аргумент, соответствующий этому спецификатору, должен быть указателем на целочисленную переменную. Спецификатор позволяет сохранить в этой переменной количество записанных символов (записанных до того места, в котором находится код %n)
%%	-- Выводит знак %

string.match

string.match (S, "шаблон", i); -- Ищет первое вхождение "шаблона" в строку S, при нахождении, возвращает совпадение, иначе nil
   -- i (необязательный параметр) - указывает с какого по счету символа начинать поиск (по-умолчанию, 1)
S:match ("шаблон", i); -- Эквивалентно

string.gmatch

string.gmatch (S, "шаблон"); -- Возвращает итератор, который, при каждом вызове, возвращает следующее вхождение шаблона в S
S:gmatch("шаблон"); -- Эквивалентно
-- Пример:
Str = "Привет, Мир!";
for S in string.gmatch (Str, "р") do
-- какой-то код
end;
-- Данный цикл совершит 2 итерации, каждый раз помещая в переменную S букву "р"

string.gsub

string.gsub(S, "Шаблон поиска", "Шаблон замены", n); -- Возвращает копию S, в которой все вхождения "Шаблона поиска" заменяются на "Шаблон замены", который может быть строкой, таблицей или функцией, вторым значением возвращает общее количество проведенных подстановок
   -- в "Шаблоне замены" символ % работает как символ со специальным назначением: любая последовательность в виде %n, где n от 1 до 9, заменяется на n-ную захваченную подстроку
   -- n (необязательный параметр) - указывает сколько максимум раз можно сделать подстановку
S:gsub("Шаблон поиска", "Шаблон замены", n); -- Эквивалентно
 
-- Примеры:
string.gsub("Привет, Мир!", "Мир", "Lua"); -- Вернет "Привет, Lua!"
string.gsub("Привет, Мир!", "Мир", "%1%1"); -- Вернет "Привет, МирМир!"

string.len

string.len(S); -- Возвращает длину строки S
S:len(); -- Эквивалентно
#S;      -- Эквивалентно

string.upper

string.upper(S); -- Возвращает копию строки S, где все буквы в нижнем регистре заменены на буквы в верхнем регистре
S:upper(); -- Эквивалентно

string.lower

string.lower(S); -- Возвращает копию строки S, где все буквы в верхнем регистре заменены на буквы в нижнем регистре
S:lower(); -- Эквивалентно

string.rep

string.rep(S,n); -- Возвращает строку, которая содержит n копий строки S
S:rep(n); -- Эквивалентно

string.reverse

string.reverse(S); -- Возвращает строку, в которой символы строки S расположены в обратном порядке
S:reverse(); -- Эквивалентно

string.sub

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

Поддерживаемые опции регулярных выражений:

.	-- Любой символ
%a	-- Буква (только англ.!)
%A	-- Любая буква (русская), символ, или цифра, кроме английской буквы 
%c	-- Управляющий символ
%d	-- Цифра
%D	-- Любая буква, или символ, кроме цифры
%l	-- Буква в нижней раскладке (только англ.!)
%L	-- Любая буква, символ, или цифра, кроме английской буквы в нижней раскладке
%p	-- Символ пунктуации
%P	-- Любая буква, символ, или цифра, кроме символа пунктуации
%s	-- Символ пробел
%S	-- Любая буква, символ, или цифра, кроме символа пробела
%u	-- Буква в верхней раскладке (только англ.!)
%U	-- Любая буква, символ, или цифра, кроме английской буквы в верхней раскладке
%w	-- Любая буква, или цифра (только англ.!)
%W	-- Любой символ, или буква (русская), кроме английской буквы, или цифры
%x	-- Шестнадцатеричное число
%X	-- Любая буква, или символ,  кроме цифры, или английской буквы, используемой в записи шестнадцатеричного числа 
%z	-- Строковые параметры, содержащие символы с кодом 0

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

There are 2 options to find matching text; string.match or string.find.

Both of these perform a Lua patten search on the string to find matches.


string.find()

string.find(subject string, pattern string, optional start position, optional plain flag)

Returns the startIndex & endIndex of the substring found.

The plain flag allows for the pattern to be ignored and intead be interpreted as a literal. Rather than (tiger) being interpreted as a pattern capture group matching for tiger, it instead looks for (tiger) within a string.

Going the other way, if you want to pattern match but still want literal special characters (such as .()[]+- etc.), you can escape them with a percentage; %(tiger%).

You will likely use this in combination with string.sub

Example

str = "This is some text containing the word tiger."
if string.find(str, "tiger") then
  print ("The word tiger was found.")
else
  print ("The word tiger was not found.")
end

string.match()

string.match(s, pattern, optional index)

Returns the capture groups found.

Example

str = "This is some text containing the word tiger."
if string.match(str, "tiger") then
  print ("The word tiger was found.")
else
  print ("The word tiger was not found.")
end

Overview

The string.find() method in Lua accepts two string literals and tries to find one in the other.

For example, there is a string A "This is a good day" as the main string and another string B "a good" as the search string. The string.find() method will search string A to find the string B. When found, like in the case stated, the index of the first and last characters of B as found in A will be returned. For this example, the returned value will be [9, 14].

Syntax

string.find(mainString,searchString)

Parameters

  • mainString: This is the string which will be searched in search of another.
  • searchString: This is the string that needs to be found in the mainString.

Return value

The string.find() method returns the starting and ending indices of the searchString in the mainString.

Example

string.find() is one of the most powerful library functions that is present inside the string library.

Lua doesn’t use the POSIX regular expression for pattern matching, as the implementation of the same takes 4,000 lines of code, which is actually bigger than all the Lua standard libraries together. In place of the POSIX pattern matching, the Lua’s implementation of pattern matching takes less than 500 lines.

The string.find() function is used to find a specific pattern in a given string, it normally takes two arguments, the first argument being the string in which the pattern we are trying to search, and the second argument is the pattern that we are trying to search.

There’s a third argument also, the third argument is an index that tells where in the subject string to start the search. This parameter is useful when we want to process all the indices where a given pattern appears. It is mainly used where there are chances that multiple times a same pattern will occur in the same string.

Syntax

indexstart, indexend = string.find(s,”pattern”)
or
indexstart, indexend = string.find(s,”pattern”,indexstart + z)

In the above syntax, I mentioned both the types of the string.find() function that we can make use of.

Example

Let’s consider a very simple example of the string.find() function where we will try to find a simple pattern in a given string.

Consider the example shown below −

 Live Demo

s = "hello world"
i, j = string.find(s, "hello")
print(i, j)

Notice that in the above code, the i identifier is the starting index where the pattern that we search was found, the j identifier is the ending index of that pattern.

Output

1 5

There might be scenarios where we would want to use only one of these indexes and in those cases, we can simply write the code as follows.

Example

Consider the example shown below −

_, y = string.find(s,"world")
print(y)
x, _ = string.find(s,"world")
print(x)

Output

11
7

Let’s explore one more example where we will make use of the third argument.

Example

Consider the example shown below −

s = "hello n hello y hello z"
index = string.find(s,"hello",i+1)
print(index)

Output

9

Понравилась статья? Поделить с друзьями:
  • Как исправить три тройки на 4
  • Oxc0000225 как исправить ошибку
  • Как найти мой комментарий в группе вк
  • Как исправить недосоленные огурцы в банке
  • Как найти параметр для кривой