Регулярные выражения (Regexp): различия между версиями

Материал из UoPilot
Перейти к навигации Перейти к поиску
 
(не показана 1 промежуточная версия этого же участника)
Строка 1: Строка 1:
<table border="1" cellspacing="0" cellpadding="15">  
+
<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>
<br>\b  
+
        <td>*</td>
<br>\B
+
        <td>0 или больше</td>
<br>\t
+
        <td>.</td>
<br>\s
+
        <td><div>любой символ, кроме переноса строки</td>
<br>\S
+
    </tr>
<br>\d
+
    <tr align="center">
<br>\D
+
        <td>$</td>
<br>\w
+
        <td>конец строки</td>
<br>\W
+
        <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>
  
<td>начало строки
+
<tr align="center" style="background-color:#cccccc" VALIGN=top>
конец строки
 
<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 colspan="2" align="center">Обратные ссылки</td>
 
<td colspan="2" align="center">Обратные ссылки</td>
<td style="background-color:#ffffff" colspan="2" rowspan="2">\ - общий экранирующий символ
+
<td colspan="2" align="center">Дополнительно</td>
Символы, которые нужно экранировать: ^$()<>[]{}\|.=*+?
 
<br>(?x) - игнорировать пробелы внутри регэкспа
 
(?#комментарий) - комментарий внутри регэкспа</td>
 
 
</tr>
 
</tr>
  
<td>?=
+
<tr align="center">
?!
+
        <td>?=</td>
<br>?<=
+
        <td>просмотр вперед</td>
<br>?<!
+
        <td>\n</td>
</td>
+
        <td>n - номер группы</td>
 +
        <td colspan="2">\ - общий экранирующий символ</td>
 +
    </tr>
 +
    <tr align="center">
 +
        <td>?!</td>
 +
        <td>отрицание просмотра вперед</td>
 +
        <td>(?&lt;char&gt;\w)</td>
 +
        <td>именованная группа</td>
 +
        <td colspan="2">символы, которые нужно экранировать: ^$()&lt;&gt;[]{}\|.=*+?</td>
 +
    </tr>
 +
    <tr align="center">
 +
        <td>?&lt;=</td>
 +
        <td>просмотр назад</td>
 +
        <td>\k&lt;char&gt;</td>
 +
        <td>обращение к группе</td>
 +
        <td colspan="2">(?x) - игнорировать пробелы внутри регэкспа</td>
 +
    </tr>
 +
    <tr align="center">
 +
        <td>?&lt;!</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>
  
<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>
 
  
  

Текущая версия на 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