Регулярные выражения (Regexp)
Версия от 20:18, 22 сентября 2020; Fors1k (обсуждение | вклад)
| Спецсимволы | Квантификаторы | Диапазоны | |||
| ^ | начало строки | * | 0 или больше | . | любой символ, кроме переноса строки |
| $ | конец строки | *? | 0 или больше, нежадный | (a|b) | a или b |
| \b | граница слова | + | 1 или больше | (...) | группа |
| \B | не граница слова | +? | 1 или больше, нежадный | (?:...) | пассивная группа |
| \t | табуляция | ? | 0 или 1 | [abc] | a, b или с |
| \s | пробел | ?? | 0 или 1, нежадный | [^abc] | кроме a, b, с |
| \S | не пробел | {3} | ровно 3 | [a-q] | буква между a и q |
| \d | цифра | {,3} | 3 или больше | [A-Q] | буква между A и Q |
| \D | не цифра | {3,5} | 3, 4 или 5 |
[0-7] | цифра между 0 и 7 |
| \w | слово | {3,5}? | 3, 4 или 5, нежадный | [а-я] | буква между а и я, ё не входит в этот диапазон |
| \W | не слово | [А-Я] | буква между А и Я, Ё не входит в этот диапазон | ||
| Утверждения | Обратные ссылки | Дополнительно | |||
| ?= | просмотр вперед | \n | n - номер группы | \ - общий экранирующий символ | |
| ?! | отрицание просмотра вперед | (?<char>\w) | именованная группа | символы, которые нужно экранировать: ^$()<>[]{}\|.=*+? | |
| ?<= | просмотр назад | \k<char> | обращение к группе | (?x) - игнорировать пробелы внутри регэкспа | |
| ?<! | отрицание просмотра назад | \k'name' | обращение к группе | (?#комментарий) - комментарий внутри регэкспа | |
| (?n) | ссылка на подмаску | ||||
Примеры с числами
// Найти цифру.
set $regexp "\d" // регэксп
set $string Вася съел 3 яблока. // строка, в которой нужно найти цифру
set #n regexp (#position $hitstring $string $regexp)
if #n > 0 // если найдено
log $hitstring // вывод в лог что нашлось
end_if
end_script
// Найти трехзначное число.
set $regexp "\d\d\d" // или "\d{3}"
set $string 1 килограмм 458 грамм.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число, состоящее из трёх-пяти цифр.
set $regexp "\d{3,5}"
set $string Потрачено 5389 рублей.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число, состоящее из 3 и более цифр.
set $regexp "\d{3,}"
set $string 12 32 65432 4
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число, состоящее из любого количества цифр.
set $regexp "\d+"
set $string 23567812
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число, состоящее из любого количества цифр, при этом слева и справа не должно быть других букв.
// Т. е. в строке: 'Vasya123' число 123 не будет найдено, т. к оно является границей слова Vasya.
set $regexp "\b\d+\b"
set $string Логин: Vasya123. Пароль: 5432.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число, состоящее из любого количества цифр, при этом оно должно быть границей слова.
set $regexp "\B\d+"
set $string Логин: Vasya123 Пароль: 54321.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число, состоящее из трёх или шести цифр.
set $regexp "\b\d{3}\b|\b\d{6}\b"
set $string 1234 345678 22
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти дробное число. При этом целое число не будет найдено.
set $regexp "\d+[,.]\d+"
set $string 444 123.456 22
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти целое или дробное число.
set $regexp "\b\d*[,.]??\d+\b"
set $string qwe 833.45 rrr
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число с точками или запятыми.
set $regexp "\d+([,.]\d+)+"
set $string На вашем счету: 2.000.000.000 рублей.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти все числа в строке. Дробные и целые.
set $regexp "\b\d*[,.]??\d+\b"
set $string USD 64,70 EUR 73,19 НЕФТЬ 50,48
set #n regexp (#position $hitstring $string $regexp)
while 1 = 1
if #n > 0
log $hitstring // вывод результата в лог
set #z #position + size($hitstring) // позиция числа + длина числа
set $string delete($string 1 #z) // удалить начало строки для дальнейшего поиска
set #n regexp (#position $hitstring $string $regexp)
else
break // если ничего не найдено прервать цикл
end_if
end_while
End_script
// Найти дату в формате xx.xx.xxxx
set $regexp "\d{2}\.\d{2}\.\d{4}"
set $string Дата рождения 10.09.2016
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти дату в формате xx.xx.xxxx или xx.xx.xx
set $regexp "\d{2}\.\d{2}\.\d{4}|\d{2}\.\d{2}\.\d{2}"
set $string Дата рождения 10.09.16
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число, если оно вначале строки
set $regexp "^\d+"
set $string 444 qwer 666
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число, если оно в конце строки
set $regexp "\d+$"
set $string 444 qwer 666
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти число после слова 'сумма:', может быть целым и не целым
set $regexp "(?<=сумма:)\s*[\d.,]+"
set $string Вы получили 540 рублей, общая сумма: 5032 рубля.
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
// учтите, что пробелы перед числом тоже будут присутствовать в строке
// если после слова 'сумма:' будет пробел, то переменная '$hitstring' будет содержать ' 5032'
// в избежание ошибок рекомендуется обрезать пробелы с помощью trim
set $a trim($hitstring)
log $a
end_if
end_script
// Найти число после слова 'сумма:', может быть целым и не целым
// В отличии от примера 2, в котором после слова 'сумма:' может быть любое количество пробелов и требуется обрезать их,
// то в этом, пробел может отсутствовать или быть только 1, но при этом не требуется использовать trim.
set $regexp "(?<=сумма:|сумма:\s)[\d.,]+"
set $string Вы получили 540 рублей, общая сумма: 5032 рубля.
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
log $hitstring
end_if
end_script
// Найти число, которое стоит перед словом 'золото'
set $regexp "[\d.,]+(?=\s*золото)"
set $string Ваши ресурсы: 48 золото, 69 руда.
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
log $hitstring
end_if
end_script
// Найти число между словами: 'Петя' и 'груш'
set %a [1] Вася съел 2 яблока, а Петя 3 груши. // строка, в которой ищем текст
log mode compact
set $regexp "(?<=Петя)\s*\d+(?=\s*груш)" // искать число между словами Петя и груш
set #n regexp (#position $hitstring %a [1] $regexp)
if #n > 0
set $hitstring trim($hitstring) // обрезать пробелы
log $hitstring
end_if
End_script
// Найти положительное число, т. е. если перед ним нет знака минус '-'
set $regexp "(?<!-)\b\d+\b"
set $string -123 456
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
log $hitstring
end_if
end_script
// Найти число, если после него нет слова доллар
set $regexp "\b\d+\b(?!\s*доллар)"
set $string 123 доллара, 456 рублей
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
log $hitstring
end_if
end_script
// Найти в строке пару одинаковых чисел
set $regexp "(\d)\1"
set $string 14325778690
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
log Найдено $hitstring в позиции #position
end_if
end_script
// Найти все целые числа в тексте. В строке может быть несколько чисел.
log mode compact
log clear
// массив, может быть получен из буфера или загружен из файла
set %a [1] qwe 111 222 wer
set %a [2] 333 rrr trt
set %a [3] tyt eerr 444 zxc 555 dff
set %a [4] sdf oi qw ee w
set %a [5] 666 ewewewe 777 ewewe 888
set %a [6] jkjk 999 ewe
set $regexp "\d+" // любые целые числа (если нужно искать другие данные, изменить регэксп на нужное)
for #i 1 size(%a) // перебираем все строки
set $string %a[#i]
set #n regexp (#position $hitstring $string $regexp)
while 1 = 1
if #n > 0
log $hitstring // вывод результата в лог
set #z #position + size($hitstring) // позиция числа + длина числа
set $string delete($string 1 #z) // удалить начало строки для дальнейшего поиска
set #n regexp (#position $hitstring $string $regexp)
else
break // если ничего не найдено прервать цикл и искать в следующей строке
end_if
end_while
end_for
End_script
// Найти чётное число
set $regexp "\b\d*[02468]\b"
set $string 123 321 456 327
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
log $hitstring
end_if
end_script
// Найти нечётное число
set $regexp "\b\d*[13579]\b"
set $string 122 321 456
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
log $hitstring
end_if
end_script
// Найти ip адрес
set $regexp "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(?1)){3}\b"
set $string qwert 123 rty 192.168.1.1 452 ewq
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
Примеры с текстом
// Найти текст (не число)
set $regexp "\D+"
set $string 123 + 456
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
set $hitstring trim($hitstring) // обрезать пробелы, т. к. они тоже не являются числами и будут найдены
log $hitstring
end_if
end_script
// Найти слово
set $regexp "\w+" // \w это: a-z, A-Z, 0-9 и _
set $string Hello World!!!
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти 2 слова через пробел или несколько пробелов
set $regexp "\w+\s+\w+"
set $string Hello World!!!
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти слово без заглавных букв
set $regexp "\b[a-z]+"
set $string Hello world!!!
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти слово из русских букв
set $regexp "[а-яА-Я]+" // буква ё не входит в диапазон, её надо записывать отдельно: [а-яА-ЯёЁ]+
set $string Hello Мир!!!
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти слово, заканчивающееся на 3, 6 или 9
set $regexp "\w+[369]\b"
set $string Vasya32 and Misha36
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти слово, заканчивающееся на любое число
set $regexp "[a-zA-Z]+[0-9]+\b"
set $string Vasya, Misha364
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти первое слово в строке
set $regexp "^\w+"
set $string Hello world
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти последнее слово в строке
set $regexp "\w+$"
set $string Hello world
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти слова hot, hat или hit
set $regexp "h[oai]t"
set $string hot water
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти слово из 5 букв
set $regexp "\w{5}"
set $string My name is Misha.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти слово из 4-6 букв
set $regexp "[a-zA-Z]{4,6}"
set $string Cat, dog, mouse, rat.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти слово из 6 или больше букв
set $regexp "[a-zA-Z]{6,}"
set $string Cat, dog, mouse, crocodile, rat.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти дату в формате: число месяц буквами год
set $regexp "\d{1,2}\s*[а-я]+\s*\d{4}"
set $string День рождения: 26 ноября 2016
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти текст после слова 'была'
set $regexp "(?<=была\s)[а-яa-z]+"
set $string У попа была собака.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти текст перед словами ', в лес'
set $regexp "[а-яa-z]+(?=,\s*в лес)"
set $string Работа не волк, в лес не уйдёт.
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти текст между тегами <div> </div>
set $regexp "(?<=\<div\>).*(?=\<\/div\>)"
set $string <div>text1</div>
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Проверить состоит ли строка из 5-10 символов,
// из которых хотя бы 1 заглавная буква, 1 строчная и 1 цифра
set $regexp "^((?=.*[A-Z])(?=.*[a-z])(?=.*\d).{5,10})$"
set $string qWeRty43
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script
// Найти имя картинки в формате jpg, bmp или png
set $regexp "([^\s]+(?=\.(jpg|bmp|png))\.\2)" // или так: "[^\s]+(?=\.(jpg|bmp|png))", если нужно имя без расширения
set $string Image: foto123.jpg
set #n regexp (#position $hitstring $string $regexp)
if #n > 0
log $hitstring
end_if
end_script