Регулярные выражения (Regexp): различия между версиями
Tatikoma (обсуждение | вклад) (Новая страница: «<table border="1" cellspacing="0" cellpadding="15"> <tr style="background-color:#cccccc" align="center"><td colspan="2">Спецсимволы</td> &...») |
Tatikoma (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | + | <table border="1" cellspacing="0" cellpadding="15"> | |
− | + | <tr style="background-color:#cccccc" align="center"><td colspan="2">Спецсимволы</td> | |
− | + | <td colspan="2">Квантификаторы</td> | |
− | + | <td colspan="2">Диапазоны</td> | |
− | + | </tr> | |
− | + | <tr VALIGN=top> | |
− | + | <td>^ | |
$ | $ | ||
− | + | <br>\b | |
− | + | <br>\B | |
− | + | <br>\t | |
− | + | <br>\s | |
− | + | <br>\S | |
− | + | <br>\d | |
− | + | <br>\D | |
− | + | <br>\w | |
− | + | <br>\W | |
− | + | </td> | |
− | + | <td>начало строки | |
конец строки | конец строки | ||
− | + | <br>граница слова | |
− | + | <br>не граница слова | |
− | + | <br>табуляция | |
− | + | <br>пробел | |
− | + | <br>не пробел | |
− | + | <br>цифра | |
− | + | <br>не цифра | |
− | + | <br>слово | |
− | + | <br>не слово | |
− | + | </td> | |
− | + | <td><nowiki>*</nowiki> | |
− | + | <nowiki>*?</nowiki> | |
− | + | <br>+ | |
− | + | <br>+? | |
− | + | <br>? | |
− | + | <br>?? | |
− | + | <br>{3} | |
− | + | <br>{3,} | |
− | + | <br>{3,5} | |
− | + | <br>{3,5}? | |
− | + | </td> | |
− | + | <td>0 или больше | |
0 или больше, нежадный | 0 или больше, нежадный | ||
− | + | <br>1 или больше | |
− | + | <br>1 или больше, нежадный | |
− | + | <br>0 или 1 | |
− | + | <br>0 или 1, нежадный | |
− | + | <br>ровно 3 | |
− | + | <br>3 или больше | |
− | + | <br>3, 4 или 5 | |
− | + | <br>3, 4 или 5, нежадный | |
− | + | </td> | |
− | + | <td>. | |
(a|b) | (a|b) | ||
− | + | <br>(...) | |
− | + | <br>(?:...) | |
− | + | <br>[abc] | |
− | + | <br>[^abc] | |
− | + | <br>[a-q] | |
− | + | <br>[A-Q] | |
− | + | <br>[0-7] | |
− | + | <br>[а-я] | |
− | + | <br>[А-Я] | |
− | + | </td> | |
− | + | <td>любой символ, кроме переноса строки | |
a или b | a или b | ||
− | + | <br>группа | |
− | + | <br>пассивная группа | |
− | + | <br>a, b или с | |
− | + | <br>кроме a, b, с | |
− | + | <br>буква между a и q | |
− | + | <br>буква между A и Q | |
− | + | <br>цифра между 0 и 7 | |
− | + | <br>буква между а и я, ё не входит в этот диапазон | |
− | + | <br>буква между А и Я, Ё не входит в этот диапазон | |
− | + | </td> | |
− | + | </tr> | |
− | + | <tr style="background-color:#cccccc" VALIGN=top> | |
− | + | <td colspan="2" align="center">Утверждения</td> | |
− | + | <td colspan="2" align="center">Обратные ссылки</td> | |
− | + | <td style="background-color:#ffffff" colspan="2" rowspan="2">\ - общий экранирующий символ | |
− | Символы, которые нужно экранировать: ^$() | + | Символы, которые нужно экранировать: ^$()<>[]{}\|.=*+? |
− | + | <br>(?x) - игнорировать пробелы внутри регэкспа | |
− | (?#комментарий) - комментарий внутри регэкспа | + | (?#комментарий) - комментарий внутри регэкспа</td> |
− | + | </tr> | |
− | + | <td>?= | |
?! | ?! | ||
− | + | <br>?<= | |
− | + | <br>?<! | |
− | + | </td> | |
− | + | <td>просмотр вперед | |
отрицание просмотра вперед | отрицание просмотра вперед | ||
− | + | <br>просмотр назад | |
− | + | <br>отрицание просмотра назад | |
− | + | </td> | |
− | + | <td VALIGN=top>\n | |
− | (? | + | (?<char>\w) |
− | + | <br>\k<char> | |
− | + | <br>\k'name' | |
− | + | <br>(?n) | |
− | + | </td> | |
− | + | <td VALIGN=top>n - номер группы | |
именованная группа | именованная группа | ||
− | + | <br>обращение к группе | |
− | + | <br>обращение к группе | |
− | + | <br>ссылка на подмаску | |
− | + | </td> | |
− | + | </table> | |
Строка 275: | Строка 275: | ||
// Найти число после слова 'сумма:', может быть целым и не целым | // Найти число после слова 'сумма:', может быть целым и не целым | ||
− | set $regexp "(? | + | set $regexp "(?<=сумма:)\s*[\d.,]+" |
set $string Вы получили 540 рублей, общая сумма: 5032 рубля. | set $string Вы получили 540 рублей, общая сумма: 5032 рубля. | ||
set #n regexp (#position $hitstring $string $regexp) | set #n regexp (#position $hitstring $string $regexp) | ||
Строка 290: | Строка 290: | ||
// В отличии от примера 2, в котором после слова 'сумма:' может быть любое количество пробелов и требуется обрезать их, | // В отличии от примера 2, в котором после слова 'сумма:' может быть любое количество пробелов и требуется обрезать их, | ||
// то в этом, пробел может отсутствовать или быть только 1, но при этом не требуется использовать trim. | // то в этом, пробел может отсутствовать или быть только 1, но при этом не требуется использовать trim. | ||
− | set $regexp "(? | + | set $regexp "(?<=сумма:|сумма:\s)[\d.,]+" |
set $string Вы получили 540 рублей, общая сумма: 5032 рубля. | set $string Вы получили 540 рублей, общая сумма: 5032 рубля. | ||
set #n regexp (#position $hitstring $string $regexp) | set #n regexp (#position $hitstring $string $regexp) | ||
Строка 310: | Строка 310: | ||
set %a [1] Вася съел 2 яблока, а Петя 3 груши. // строка, в которой ищем текст | set %a [1] Вася съел 2 яблока, а Петя 3 груши. // строка, в которой ищем текст | ||
log mode compact | log mode compact | ||
− | set $regexp "(? | + | set $regexp "(?<=Петя)\s*\d+(?=\s*груш)" // искать число между словами Петя и груш |
set #n regexp (#position $hitstring %a [1] $regexp) | set #n regexp (#position $hitstring %a [1] $regexp) | ||
if #n > 0 | if #n > 0 | ||
Строка 319: | Строка 319: | ||
// Найти положительное число, т. е. если перед ним нет знака минус '-' | // Найти положительное число, т. е. если перед ним нет знака минус '-' | ||
− | set $regexp "(? | + | set $regexp "(?<!-)\b\d+\b" |
set $string -123 456 | set $string -123 456 | ||
set #n regexp (#position $hitstring $string $regexp) | set #n regexp (#position $hitstring $string $regexp) | ||
Строка 531: | Строка 531: | ||
// Найти текст после слова 'была' | // Найти текст после слова 'была' | ||
− | set $regexp "(? | + | set $regexp "(?<=была\s)[а-яa-z]+" |
set $string У попа была собака. | set $string У попа была собака. | ||
set #n regexp (#position $hitstring $string $regexp) | set #n regexp (#position $hitstring $string $regexp) | ||
Строка 548: | Строка 548: | ||
end_script | end_script | ||
− | // Найти текст между тегами | + | // Найти текст между тегами <nowiki><div> </div></nowiki> |
− | set $regexp | + | set $regexp <nowiki>"(?<=\<div\>).*(?=\<\/div\>)"</nowiki> |
− | set $string | + | set $string <nowiki><div>text1</div></nowiki> |
set #n regexp (#position $hitstring $string $regexp) | set #n regexp (#position $hitstring $string $regexp) | ||
if #n > 0 | if #n > 0 |
Версия 11:37, 28 августа 2019
Спецсимволы | Квантификаторы | Диапазоны | |||
^
$
|
начало строки
конец строки
|
*
*?
|
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