Регулярные выражения (Regexp)

Материал из UoPilot
Версия от 21:55, 27 августа 2019; Tatikoma (обсуждение | вклад) (Новая страница: «<table border="1" cellspacing="0" cellpadding="15"> <tr style="background-color:#cccccc" align="center"><td colspan="2">Спецсимволы</td> &...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

<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 или больше, нежадный <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) <br>(...) <br>(?:...) <br>[abc] <br>[^abc] <br>[a-q] <br>[A-Q] <br>[0-7] <br>[а-я] <br>[А-Я] </td>

<td>любой символ, кроме переноса строки 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>


Примеры с числами

// Найти цифру.
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
// Найти текст между тегами <nowiki><div> </div></nowiki>
set $regexp <nowiki>"(?<=\<div\>).*(?=\<\/div\>)"</nowiki>
set $string <nowiki><div>text1</div></nowiki>
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