Регулярные выражения (Regexp): различия между версиями
Перейти к навигации
Перейти к поиску
Tatikoma (обсуждение | вклад) |
Fors1k (обсуждение | вклад) |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 1: | Строка 1: | ||
− | <table border="1" cellspacing="0" cellpadding=" | + | <table border="1" cellspacing="0" cellpadding="2"> |
− | <tr style="background-color:#cccccc" align="center"><td colspan="2">Спецсимволы</td> | + | <tr align="center" style="background-color:#cccccc" align="center"> |
+ | <td colspan="2">Спецсимволы</td> | ||
<td colspan="2">Квантификаторы</td> | <td colspan="2">Квантификаторы</td> | ||
<td colspan="2">Диапазоны</td> | <td colspan="2">Диапазоны</td> | ||
</tr> | </tr> | ||
− | <tr VALIGN=top> | + | <tr align="center" VALIGN=top> |
− | <td>^ | + | <td>^</td> |
− | $ | + | <td>начало строки</td> |
− | < | + | <td>*</td> |
− | < | + | <td>0 или больше</td> |
− | < | + | <td>.</td> |
− | < | + | <td><div>любой символ, кроме переноса строки</td> |
− | < | + | </tr> |
− | < | + | <tr align="center"> |
− | < | + | <td>$</td> |
− | < | + | <td>конец строки</td> |
− | < | + | <td>*?</td> |
− | </td> | + | <td>0 или больше, нежадный</td> |
+ | <td>(a|b)</td> | ||
+ | <td>a или b</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>\b</td> | ||
+ | <td>граница слова</td> | ||
+ | <td>+</td> | ||
+ | <td>1 или больше</td> | ||
+ | <td>(...)</td> | ||
+ | <td>группа</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>\B</td> | ||
+ | <td>не граница слова</td> | ||
+ | <td>+?</td> | ||
+ | <td>1 или больше, нежадный</td> | ||
+ | <td>(?:...)</td> | ||
+ | <td>пассивная группа</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>\t</td> | ||
+ | <td>табуляция</td> | ||
+ | <td>?</td> | ||
+ | <td>0 или 1</td> | ||
+ | <td>[abc]</td> | ||
+ | <td>a, b или с</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>\s</td> | ||
+ | <td>пробел</td> | ||
+ | <td>??</td> | ||
+ | <td>0 или 1, нежадный</td> | ||
+ | <td>[^abc]</td> | ||
+ | <td>кроме a, b, с</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>\S</td> | ||
+ | <td>не пробел</td> | ||
+ | <td>{3}</td> | ||
+ | <td>ровно 3</td> | ||
+ | <td>[a-q]</td> | ||
+ | <td>буква между a и q</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>\d</td> | ||
+ | <td>цифра</td> | ||
+ | <td>{,3}</td> | ||
+ | <td>3 или больше</td> | ||
+ | <td>[A-Q]</td> | ||
+ | <td>буква между A и Q</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>\D</td> | ||
+ | <td>не цифра</td> | ||
+ | <td>{3,5}</td> | ||
+ | <td><div>3, 4 или 5</td> | ||
+ | <td>[0-7]</td> | ||
+ | <td>цифра между 0 и 7</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>\w</td> | ||
+ | <td>слово</td> | ||
+ | <td>{3,5}?</td> | ||
+ | <td>3, 4 или 5, нежадный</td> | ||
+ | <td>[а-я]</td> | ||
+ | <td>буква между а и я, ё не входит в этот диапазон</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>\W</td> | ||
+ | <td>не слово</td> | ||
+ | <td style="background-color:#808080" colspan="2"></td> | ||
+ | <td>[А-Я]</td> | ||
+ | <td>буква между А и Я, Ё не входит в этот диапазон</td> | ||
+ | </tr> | ||
− | + | <tr align="center" style="background-color:#cccccc" VALIGN=top> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | <tr style="background-color:#cccccc" VALIGN=top> | ||
<td colspan="2" align="center">Утверждения</td> | <td colspan="2" align="center">Утверждения</td> | ||
<td colspan="2" align="center">Обратные ссылки</td> | <td colspan="2" align="center">Обратные ссылки</td> | ||
− | <td | + | <td colspan="2" align="center">Дополнительно</td> |
− | |||
− | |||
− | |||
</tr> | </tr> | ||
− | <td>?= | + | <tr align="center"> |
− | ?! | + | <td>?=</td> |
− | < | + | <td>просмотр вперед</td> |
− | < | + | <td>\n</td> |
− | </td> | + | <td>n - номер группы</td> |
+ | <td colspan="2">\ - общий экранирующий символ</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>?!</td> | ||
+ | <td>отрицание просмотра вперед</td> | ||
+ | <td>(?<char>\w)</td> | ||
+ | <td>именованная группа</td> | ||
+ | <td colspan="2">символы, которые нужно экранировать: ^$()<>[]{}\|.=*+?</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>?<=</td> | ||
+ | <td>просмотр назад</td> | ||
+ | <td>\k<char></td> | ||
+ | <td>обращение к группе</td> | ||
+ | <td colspan="2">(?x) - игнорировать пробелы внутри регэкспа</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td>?<!</td> | ||
+ | <td>отрицание просмотра назад</td> | ||
+ | <td>\k'name'</td> | ||
+ | <td>обращение к группе</td> | ||
+ | <td colspan="2">(?#комментарий) - комментарий внутри регэкспа</td> | ||
+ | </tr> | ||
+ | <tr align="center"> | ||
+ | <td style="background-color:#808080" colspan="2"></td> | ||
+ | <td>(?n)</td> | ||
+ | <td>ссылка на подмаску</td> | ||
+ | <td style="background-color:#808080" colspan="2"></td> | ||
+ | </tr> | ||
+ | </table> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Текущая версия на 20:22, 22 сентября 2020
Спецсимволы | Квантификаторы | Диапазоны | |||
^ | начало строки | * | 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