Шукати в цьому блозі

Парсинг, Регулярні вирази - патерни

Парсинг, Регулярні вирази - патерни

 !
Якщо ви звикли до інших мов, які мають регулярні вирази, пам'ятайте, що патерни Луа не те ж саме що регулярки: вони більш обмежені, і має інший синтаксис.


string.find ( 'banana', 'an')  Шукає перше входження паттерна 'an' в рядку 'banana'. Якщо патерн знайдений, то функція повертає позиції його початку і кінця, в іншому випадку повертається nil


x,y = string.find('banana', 'an')
print (x,y) -- результат 2 3

--ще приклад
print (string.find ("the quick brown fox", "quick")) --результат 5 9

x,y = string.find('banana', 'lua') -- 'Lua "не буде знайдено
print (x,y) -- результат nil


Але буквально ідентичний текст не не надто корисно шукати, набагато цікавіше використовувати в шаблоні патерна спецсимволи: '.' - наприклад значить шукати будь-який символ

x,y = string.find("abcdefg", 'b..') -- результат 2 4

Тепер ми можемо використовувати це, щоб отримати потрібний текст, але є спосіб краще: String.match функція. Вона повертає відповідний текст, або nil, якщо патерн не знайдено:

x = string.match("abcdefg", 'b..')
print (x) --результат bcd

Є різні спецсимволи патерні в %d-будь-яка цифр а %u - велика літера

x = string.match("foo 123 bar", '%d%d%d')
--результат 123
x = string.match("text with an Uppercase letter", '%u')
--результат U
Дивимося повний список значень спецсимволів:

Якщо потрібно щоб Луа розумів спецсимвол як звичайний - можна його екранувати спецсимволи '\',
оскільки в самих патернах для екранування використовується символ '%'.

Якщо потрібно щоб Луа розумів спецсимвол як звичайний - можна його екранувати спецсимволи '\',
оскільки в самих патернах для екранування використовується символ '%'.

Наступні спеціальні шаблони визначають класи символів:
'%z' Нульовий символ
'%s' Символ пробілу
'%l' буква в нижньому регістрі
'%u' Буква в верхньому регістрі
'%a' буква
'%d' цифра
'%x' шіснадцятирічна цифра
'%w' буква або цифра
'%p' символ пунктуации
'%с' Керуючий символ
'%' Екранування або надання особливого значення
'.' любий символ
'^' початок рядка
'$' Кінець рядка
'(…)' група
'%d' (d — цифра) група з номером d
'*' 0 або більше символів
'-' 0 або більше символів (Найкоротша відповідність)
'+' 1 або більше символів
'?' 0 або 1 символ
'[…]' Безліч символів
'[^…]' Заперечення безлічі символів
%bxy Ділянку рядки між збалансованими символами
Ви можете створювати безлічі символів, обернувши групу символів в квадратних дужках. Результат буде відповідати одному з групи символів у дужках. Якщо першим символом всередині дужок є ^, то результат поверне все крім символів в дужках

x = string.match("abcd", '[cb][cb]') -- знайти с чи b 2 рази
--bc
x = string.match("abcd", '[^ad]') -- крім a чи d
--b
x = string.match("123", '[0-5]') -- знайти любу цифру з 0 до 5
--123

Повторення
Для того щоб ми могли шукати не тільки фіксованої довжини рядка Є 4 символа повторення вказують скільки разів повторити попередній символ:
'*' 0 або більше символів
'-' 0 або більше символів (найкоротший відповідність)
'+' 1 або більше символів
'?' 0 або 1 символ

x = string.match("examples", 'examples?')
--examples
x = string.match("example", 'examples?')
--example
x = string.match("example", 'examples')
--nil 
----------------------------------------------------------------
x = string.match("this is some text with a number 12345 in it", '%d')
--1
x = string.match("this is some text with a number 12345 in it", '%d+')
--12345
-------------------------------------------------------------
Порівняємо з с+
x = string.match("one |two| three", '|.*|')
--|two|
x = string.match("one || three", '|.*|')
--||
x = string.match("one || three", '|.+|')
--nil
Якщо * жадібний і бере максимальну збіглася рядок то '-' бере мінімум
x = string.match("one |two| three |four| five", '|.*|')
--|two| three |four|
x = string.match("one |two| three |four| five", '|.-|')
--|two|
x = string.match("one |two| three |four| five", '|[^|]*|') -- Якби не було '-' то довелося б так парсити
--|two|

ще приклади:

x = string.match("abc", 'a.*') -- Шукаємо А + будь-який символ + повтор будь-який символ
--abc
x = string.match("abc", 'a.-') -- Після '-' немає нічого тому таке застосування не спрацює
--a
x = string.match("abc", 'a.-$') -- $ -Вказує кінець рядка
abc
x = string.match("abc", '^.-b') -- ^ Шукає початок рядка
--ab

А якщо нам потрібно знайти символ який є спецсимволи - ми просто екрануєм його символом %  приклад:

x = string.match("%*^", '%%%*%^')
-- Тут ми шукаємо%*^ але перед кожним символом ставимо % щоб Луа сприймав їх як звичайні символи
--%*^
Захоплення

Якщо потрібно знайти певний рядок але потрібна тільки його частину для подальшої роботи частину патерна ми укладаємо в () і результатом  повернеться тільки вираз в () хоча шукати буде весь рядок

x = string.match("foo: 123 bar: 456", '(%a+):%s*(%d+)%s+(%a+):%s*(%d+)') -- %a: ,буква %s: пробіл
--foo123bar456
З цими знаннями можна створити браузерного бота або просто парсити потрібну інформацію з інтернет і
виводити в своєму додатку (погода, курси валют і т.п.)


Немає коментарів:

Дописати коментар