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

Материал из UoPilot
Версия от 20:22, 22 сентября 2020; Fors1k (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску
Спецсимволы Квантификаторы Диапазоны
^ начало строки * 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