Метасимвол "\G" впервые появился в Perl и предназначался для проведения глобального поиска с модификатором /g (…79). Он совпадает с позицией, в которой завершилось предыдущее совпадение. При первой итерации "\G" совпадает только в начале строки, как и метасимвол "\A". Если попытка поиска завершилась неудачей, позиция "\G" возвращается в начало строки. Таким образом, при многократном применении регулярного выражения (как при использовании команды "s/…/…/g" или других средств глобального поиска) неудача при очередном поиске приводит к сбросу позиции "\G" для применения следующего выражения. В Perl метасимвол "\G" обладает тремя уникальными особенностями, которые мне кажутся весьма интересными и полезными. • Позиция, связанная с "\G", является атрибутом целевой строки, а не регулярного выражения. Это позволяет последовательно применить к строке несколько регулярных выражений, причем метасимвол "\G" в каждом из них продолжит поиск с той позиции, на которой он был прерван для предыдущего выражения. • Операторы регулярных выражений Perl поддерживают модификатор /c (…380), при помощи которого можно указать, что в случае неудачного поиска позиция "\G" не сбрасывается, а остается в последней позиции. В сочетании с первым пунктом это помогает организовать проверку по нескольким регулярным выражениям с одной позиции целевого текста, которая смещается только при обнаружении совпадения. • Текущую позицию метасимвола "\G" можно получить и изменить с использованием средств, не имеющих отношения к регулярным выражениям (функция pos …378). Например, ее можно задать так, чтобы поиск начинался с заданной позиции. Кроме того, поддержка этой возможности в языке позволяет имитировать функциональность предыдущего пункта, если она не поддерживается напрямую. Примеры практического использования этих возможностей приводятся во врезке на следующей странице. Несмотря на наличие этих удобных возможностей, у метасимвола "\G" в Perl имеется недостаток – он работает надежно лишь в том случае, если находится в самом начале регулярного выражения. К счастью, именно там он используется наиболее естественным образом. Конец предыдущего или начало текущего совпадения? Одно из различий между реализациями определяется тем, с чем же в действительности совпадает "\G" – с началом текущего или с концом предыдущего совпадения? В подавляющем большинстве случаев это одно и то же, но в некоторых редких случаях эти две позиции могут различаться. ... и т.д. Джефри Фридл "Регулярные выражения" |