Регулярные выражения (Regexp)
Спецсимволы | Квантификаторы | Диапазоны | |||
^
$
|
начало строки
конец строки
|
*
*?
|
0 или больше
0 или больше, нежадный
|
.
(a|b)
|
любой символ, кроме переноса строки
a или b
|
Утверждения | Обратные ссылки | \ - общий экранирующий символ
Символы, которые нужно экранировать: ^$()<>[]{}\|.=*+?
|
|||
?=
?!
|
просмотр вперед
отрицание просмотра вперед
|
\n
(?<char>\w)
|
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