RegExp: различия между версиями
Перейти к навигации
Перейти к поиску
Tatikoma (обсуждение | вклад) (Новая страница: « == Описание == Оператор поиска позиции подстроки в строке с помощью регулярного выражени...») |
Tatikoma (обсуждение | вклад) |
||
| Строка 2: | Строка 2: | ||
== Описание == | == Описание == | ||
Оператор поиска позиции подстроки в строке с помощью регулярного выражения. | Оператор поиска позиции подстроки в строке с помощью регулярного выражения. | ||
| − | + | <br>Более подробное описание и простые примеры: [[Регулярные выражения (Regexp)]] | |
== Синтаксис == | == Синтаксис == | ||
Привязка к окну: Нет. | Привязка к окну: Нет. | ||
| − | + | <br>Работа со свернутым окном: Да. | |
| − | regexp ( | + | regexp (<#position> <$hitString> <$string> <$regexp>) |
Где: | Где: | ||
| − | + | <br>'''<#position>''' - номер позиции первого символа совпавшего выражения. Если не найдено, то -1. | |
| − | + | <br>'''<$hitString>''' - совпавшее выражение. Если не найдено, то -1 | |
| − | + | <br>'''<$string>''' - строка в которой происходит поиск. Может быть задана с помощью элементов массива. | |
| − | + | <br>'''<$regexp>''' - собственно сам регексп. Может быть задан с помощью элементов массива. | |
Регэксп присваиваемый переменной рекомендуется заключать в кавычки "". | Регэксп присваиваемый переменной рекомендуется заключать в кавычки "". | ||
| Строка 28: | Строка 28: | ||
// Пример 2 | // Пример 2 | ||
// Ищем число после слова 'сумма:', может быть целым и не целым | // Ищем число после слова 'сумма:', может быть целым и не целым | ||
| − | set $regexp "(? | + | set $regexp "(?<=сумма:)\s*[\d.,]+" |
set $string Вы получили 540 рублей, общая сумма: 5032 рубля. | set $string Вы получили 540 рублей, общая сумма: 5032 рубля. | ||
set #n regexp (#position $hitstring $string $regexp) | set #n regexp (#position $hitstring $string $regexp) | ||
| Строка 44: | Строка 44: | ||
// В отличии от примера 2, в котором после слова 'сумма:' может быть любое количество пробелов и требуется обрезать их, | // В отличии от примера 2, в котором после слова 'сумма:' может быть любое количество пробелов и требуется обрезать их, | ||
// то в этом, пробел может отсутствовать или быть только 1, но при этом не требуется использовать trim. | // то в этом, пробел может отсутствовать или быть только 1, но при этом не требуется использовать trim. | ||
| − | set $regexp "(? | + | set $regexp "(?<=сумма:|сумма:\s)[\d.,]+" |
set $string Вы получили 540 рублей, общая сумма: 5032 рубля. | set $string Вы получили 540 рублей, общая сумма: 5032 рубля. | ||
set #n regexp (#position $hitstring $string $regexp) | set #n regexp (#position $hitstring $string $regexp) | ||
| Строка 138: | Строка 138: | ||
log mode compact | log mode compact | ||
| − | set $regexp "(? | + | set $regexp "(?<=РАБОТА\\).+(?=\\Клиент)" // искать текст между словами РАБОТА\ \Клиент |
set #n regexp (#position $hitstring %a [1] $regexp) | set #n regexp (#position $hitstring %a [1] $regexp) | ||
if #n > 0 | if #n > 0 | ||
| Строка 159: | Строка 159: | ||
[[PosEx]] | [[PosEx]] | ||
| − | + | <br>[[Get number]] | |
| − | + | <br>[[Get word]] | |
== История развития == | == История развития == | ||
'''2.33''' | '''2.33''' | ||
| − | + | <br>Добавил регекспы, точнее PerlRegEx врапер для опенсорсной PCRE. Функция 'regexp (#position $hitString $string $regexp)' возвращает: | |
'1' - было совпадение | '1' - было совпадение | ||
'0' - совпадения небыло | '0' - совпадения небыло | ||
Текущая версия на 11:05, 28 августа 2019
Описание
Оператор поиска позиции подстроки в строке с помощью регулярного выражения.
Более подробное описание и простые примеры: Регулярные выражения (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
Смотрите также
История развития
2.33
Добавил регекспы, точнее PerlRegEx врапер для опенсорсной PCRE. Функция 'regexp (#position $hitString $string $regexp)' возвращает:
'1' - было совпадение
'0' - совпадения небыло
'-1' - строка задана с помощью массива, но не распознана
Где:
#position - номер позиции первого символа совпавшего выражения. Если не найдено, то -1.
$hitString - совпавшее выражение. Если не найдено, то -1
$string - строка в которой происходит поиск. Может быть задана с помощью элементов массива.
$regexp - собственно сам регексп. Может быть задан с помощью элементов массива.