Поиск от последнего совпадения
Проблема
Требуется возобновить поиск с того места, где было найдено последнее совпадение.
Такая возможность пригодится при многократном извлечении фрагментов данных из строки.
Решение
Воспользуйтесь комбинацией модификатора /g, метасимвола \G и функции
pos.
Комментарий
При наличии модификатора /g механизм поиска запоминает текущую позицию в строке.
При следующем поиске с /g совпадения ищутся, начиная с сохраненной позиции. Это позволяет
создать цикл while для извлечения необходимой информации из строки:
while (/(\d+)/g) {
print "Found $1\n";
}
Присутствие \G в шаблоне привязывает поиск к концу предыдущего совпадения.
Например, если число хранится в строке с начальными пробелами, заменам каждого пробела нулем
может выполняться так:
$n = " 49 here";
$n =~ s/\G /0/g;
print $n;
00049 here
\G часто применяется в циклах while. Например, в следующем примере анализируется список чисел,
разделенных запятыми:
while (/\G,?(\d+)/g) {
print "Found number $1\n";
}
Если поиск закончился неудачей (например, если в последнем примере кончились числа),
сохраненная позиция по умолчанию перемещается в начало строки. Если это нежелательно (например,
требуется продолжить поиски с текущей позиции, но с другим шаблоном), воспользуйтесь модификатором /с в
сочетании с /g:
$_ = "The year 1752 lost 10 days on the 3rd of September";
while (/(\d+)/gc) {
print "Found number $1\n";
}
if (/\G(\S+)/g) {
print "Found $1 after the last number. \n";
}
Found number 1752
Found number 10
Found number 3
Found rd after the last number.
Как видите, при последовательном применении шаблонов можно изменять позицию начала поиска с помощью
модификатора /g. Позиция последнего совпадения связывается со скалярной величиной, в которой происходит
поиск, а не с шаблоном. Позиция не копируется вместе со строкой и не сохраняется оператором
local.
Позиция последнего совпадения читается и задается функцией роs. Аргументом функции является строка,
для которой читается или задается позиция последпего совпадения. Если аргумент не указан, роs работает с
переменной $_:
print "The position in \$a is ", pos($a);
pos($a) = 30;
print "The position in \$_ is ", pos;
pos = 30;
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|