RegExp
Описание
Оператор поиска позиции подстроки в строке с помощью регулярного выражения. <br>Более подробное описание и простые примеры: Регулярные выражения (Regexp)
Синтаксис
Привязка к окну: Нет. <br>Работа со свернутым окном: Да.
regexp (<#position> <$hitString> <$string> <$regexp>)
Где: <br><#position> - номер позиции первого символа совпавшего выражения. Если не найдено, то -1. <br><$hitString> - совпавшее выражение. Если не найдено, то -1 <br><$string> - строка в которой происходит поиск. Может быть задана с помощью элементов массива. <br><$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 <br>Get number <br>Get word
История развития
2.33 <br>Добавил регекспы, точнее PerlRegEx врапер для опенсорсной PCRE. Функция 'regexp (#position $hitString $string $regexp)' возвращает:
'1' - было совпадение '0' - совпадения небыло '-1' - строка задана с помощью массива, но не распознана Где: #position - номер позиции первого символа совпавшего выражения. Если не найдено, то -1. $hitString - совпавшее выражение. Если не найдено, то -1 $string - строка в которой происходит поиск. Может быть задана с помощью элементов массива. $regexp - собственно сам регексп. Может быть задан с помощью элементов массива.