RegExp

Материал из UoPilot
Перейти к навигации Перейти к поиску

Описание

Оператор поиска позиции подстроки в строке с помощью регулярного выражения.
Более подробное описание и простые примеры: Регулярные выражения (Regexp)

Синтаксис

Привязка к окну: Нет.
Работа со свернутым окном: Да.

regexp (<#position> <$hitString> <$string> <$regexp>)

Где:
<#position> - номер позиции первого символа совпавшего выражения. Если не найдено, то -1.
<$hitString> - совпавшее выражение. Если не найдено, то -1
<$string> - строка в которой происходит поиск. Может быть задана с помощью элементов массива.
<$regexp> - собственно сам регексп. Может быть задан с помощью элементов массива. Регэксп присваиваемый переменной рекомендуется заключать в кавычки "".

Примеры

// Пример 1
// Ищем число в строке, может быть целым и не целым
set $regexp "[\d.,]+"    
set $string У Васи зарплата: 50.432 рубля.
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
    msg $hitstring
end_if
end_script
// Пример 2
// Ищем число после слова 'сумма:', может быть целым и не целым
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)
    msg $a  
end_if
end_script
// Пример 3
// Ищем число после слова 'сумма:', может быть целым и не целым
// В отличии от примера 2, в котором после слова 'сумма:' может быть любое количество пробелов и требуется обрезать их,
// то в этом, пробел может отсутствовать или быть только 1, но при этом не требуется использовать trim.     
set $regexp "(?<=сумма:|сумма:\s)[\d.,]+"
set $string Вы получили 540 рублей, общая сумма: 5032 рубля.
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
    msg $hitstring  
end_if
end_script
// Пример 4
// Ищем число, которое стоит перед словом 'золото'
set $regexp "[\d.,]+(?=\s*золото)"            
set $string Ваши ресурсы: 48 золото, 69 руда.
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
    msg $hitstring
end_if
end_script
// Пример 5
// Ищем номер телефона в массиве. Номер будет найден, если до него в тексте нет других чисел.
set delimiter ' '      // установить разделитель пробел, нужно если массив не одномерный
set %a [1] Адрес: г. Москва.
set %a [2] Номер телефона: 8(495)123-45-67.
set %a [3] Icq: 123456789.
   // чтобы не проверять каждую строку отдельно собираем весь массив в 1 строку
for #i 1 size(%a)
    set $string $string %a [#i]
end_for

msg $string           // получившаяся строка
set $regexp "([\d()-]\s*)+"        // номер телефона может состоять из цифр, круглых скобок, пробелов и тире
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
    msg $hitstring         
end_if
End_script
// Пример 6
// Ищем в массиве все номера телефонов в заданном формате. X(XXX)XXX-XX-XX или +XXXXXXXXXXXX или +X XXX-XX-XX.
// Регэкспы для каждого формата отдельно:
// \d\(\d{3}\)\d{3}\-\d{2}\-\d{2}   - соответствует X(XXX)XXX-XX-XX
// \+\d{12}   - соответствует +XXXXXXXXXXXX
// \+\d\s\d{3}\-\d{2}\-\d{2}   - соответствует +X XXX-XX-XX
log mode compact

set %a [1] Адрес: г. Москва.
set %a [2] Номер телефона: 8(495)123-45-67
set %a [3] Адрес: г. Омск.
set %a [4] Номер телефона: +420921234567
set %a [5] Адрес: г. Томск.
set %a [6] Номер телефона: +7 123-45-67.

for #i 1 size(%a)                  // перебираем все строки
   set $regexp "\d\(\d{3}\)\d{3}\-\d{2}\-\d{2}|\+\d{12}|\+\d\s\d{3}\-\d{2}\-\d{2}"
   set #n regexp (#position $hitstring %a[#i] $regexp)
   if #n = 1
       log $hitstring
   end_if
end_for
End_script
// Пример 7
// (?x) - позволяет игнорировать пробелы в регэкспе. Становится более читаемым.  
set $regexp "(?x) \w+   \@   \w+   \.   \w{2,3}"
set $string Почта: Google@gmail.com
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
    msg $hitstring
end_if
End_script
// Пример 8
// Найти все числа в строке.
log mode compact
set $regexp "(?x) \b  \d+[,.]??\d+  \b   |  \b\d\b"
set $string USD 64,70   EUR 73,19   НЕФТЬ 50,48
set #n regexp (#position $hitstring $string $regexp)
while 1 = 1
    if #n = 1
        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
// Пример 9
// Найти текст между словами
set %a [1] Z:\__РАБОТА!!!!\ТЕКУЩАЯ РАБОТА\ТАНЯ\Клиент\АСК\для размышлений.pdf       // строка, в которой ищем текст

log mode compact
set $regexp "(?<=РАБОТА\\).+(?=\\Клиент)"        // искать текст между словами РАБОТА\ \Клиент
set #n regexp (#position $hitstring %a [1] $regexp)   
if #n > 0
    log $hitstring
end_if
End_script
// Пример 10
// Обратные ссылки
// Найти в строке пару чисел
set $regexp "(\d)\1"    
set $string 14325778690
set #n regexp (#position $hitstring $string $regexp)
if #n = 1
    log Найдено $hitstring в позиции #position
end_if
end_script

Смотрите также

PosEx
Get number
Get word

История развития

2.33
Добавил регекспы, точнее PerlRegEx врапер для опенсорсной PCRE. Функция 'regexp (#position $hitString $string $regexp)' возвращает:

'1' - было совпадение
'0' - совпадения небыло
'-1' - строка задана с помощью массива, но не распознана
Где:
    #position - номер позиции первого символа совпавшего выражения. Если не найдено, то -1.
    $hitString - совпавшее выражение. Если не найдено, то -1
    $string - строка в которой происходит поиск. Может быть задана с помощью элементов массива.
    $regexp - собственно сам регексп. Может быть задан с помощью элементов массива.