Регулярные выражения (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