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 - собственно сам регексп. Может быть задан с помощью элементов массива.