Яндекс.Метрика

RegExReplace() -Autohotkey

Заменяет в строке подстроки, отвечающие шаблону (регулярному выражению).

Заменяет в строке подстроки, отвечающие шаблону (регулярному выражению).

NewStr := RegExReplace(Haystack, NeedleRegEx [, Replacement = "", OutputVarCount = "", Limit = -1, StartingPosition = 1])

Параметры

NewStr RegExReplace() возвращает копию Haystack, в которой были произведены замены. Если замен не было, Haystack возвращается неизменённой. Если происходит ошибка (например, синтаксическая ошибка в NeedleRegEx), Haystack возвращается неизменённой (исключение — версии до 1.0.46.06, возвращающие пустую строку), и ErrorLevel устанавливается в одно из значений, описанных ниже, а не в ноль.
Haystack Строка, в которой производится поиск и замена.
NeedleRegEx Шаблон для поиска, который является Perl-совместимым регулярным выражением (PCRE). Опции шаблона (если есть) должны стоять в его начале и отделяться от него закрывающей круглой скобкой. Например, шаблон "i)abc.*123" включает опцию нечувствительности к регистру и будет искать строку "abc", за которой следуют ноль или больше любых символов, за которыми следует строка "123". Если опций нет, скобка необязательна; например, ")abc" эквивалентно "abc".
Replacement Строка, которая будет подставлена вместо найденных подстрок. Она является простым текстом (не регулярным выражением). Она может содержать обратные ссылки — например, $1, которая обозначает подстроку из Haystack, совпавшую с первым подшаблоном. Первые десять ссылок обозначаются выражениями от $0 до $9, где $0 — это подстрока, отвечающая всему шаблону в целом, $1 — подстрока, совпавшая с первым подшаблоном, $2 — со вторым, и т.д. Для ссылок с номерами от 10 и выше используйте фигурные скобки: ${10}, ${11} и т.д. У именованных подшаблонов заключайте в скобки имя: ${ИмяПодшаблона}. Для обозначения литерального $ используйте $$ (это единственный символ, требующий такого специального обращения; применять левую наклонную черту для экранирования чего бы то ни было не требуется).

Чтобы изменить регистр букв в подстроке, вставляемой по обратной ссылке, поставьте после $ одну из следующих букв: U или u (верхний регистр), L или l (нижний), T или t (титульный, у которого первая буква каждого слова в верхнем регистре, а остальные в нижнем). Например, $U1 и $U{1} оба означают подстроку первого подшаблона в верхнем регистре.

Несуществующие ссылки, а также те, которые ни с чем не совпали в Haystack — как, например, один из подшаблонов в (abc)|(xyz) — трактуются как пустые строки.
OutputVarCount Имя переменной (без кавычек), в которой будет сохранено количество произведённых замен (0, если замен не было).
Limit Если Limit опущен, он считается равным -1, что означает замену всех подстрок в Haystack, отвечающих шаблону. Иначе укажите максимально допустимое число замен. Часть Haystack правее последнего совпадения будет оставлена нетронутой.
StartingPosition Начальная позиция. Если опущена, считается равной 1 (начало Haystack). Иначе укажите 2, чтобы начать со второго символа, 3 — с третьего, и т.д. Если StartingPosition находится за пределами Haystack, поиск стартует с пустой строки в конце Haystack (что, как правило, приводит к отсутствию замен).

Если StartingPosition меньше 1, она считается смещением (влево) от конца Haystack. Например, 0 означает старт с последнего символа, а -1 с предпоследнего. Если смещение выходит за начало Haystack, поиск проводится по всей строке.

Независимо от значения StartingPosition, возвращается всегда копия Haystack полностью, просто чем больше StartingPosition, тем большая часть от начала Haystack останется нетронутой.

ErrorLevel

Принимает одно из следующих значений:

  • 0, т.е. отсутствие ошибок.
  • Строка следующего вида: Compile error N at offset M: описание. В этой строке N будет номером ошибки PCRE, M — позицией ошибочного символа внутри регулярного выражения, затем следует текст, описывающий ошибку.
  • Отрицательное число, что означает, что произошла ошибка во время выполнения регулярного выражения. Хотя такие ошибки редки, с наибольшей вероятностью могут произойти следующие из них: "too many possible empty-string matches" (-22) (слишком много возможных совпадений с пустой строкой), "recursion too deep" (-21) (слишком глубокая рекурсия), "reached match limit" (-8) (достигнут лимит совпадений). Если они происходят, попробуйте перестроить регулярное выражение, чтобы сделать его более избирательным, например, заменив * на ?, + или на диапазон наподобие {0,3} везде, где это возможно.

Опции

Смотрите раздел "Опции" в статье RegExMatch()" — там описаны модификаторы шаблонов, влияющие на поиск, такие как "i)abc", который включает независимость от регистра для шаблона "abc" (прим. переводчика: конкретно опция i для русских букв не действует).

Производительность

Для замены простых подстрок используйте StringReplace, т.к. она работает быстрее, чем RegExReplace().

Если вам известно максимально возможное число замен, то задав его в параметре Limit, вы можете улучшить производительность, поскольку это позволит раньше прекратить поиск (также это может снизить использование памяти). Например, если вы знаете, что может быть только одно совпадение близко к началу длинной строки, задайте Limit как 1.

Опция изучения (S) может иногда улучшить производительность регулярного выражения, которое используется много раз (например, в цикле).

Примечания

Большинство символов, таких как abc123, могут использоваться внутри регулярных выражений буквально. Однако символам \ . * ? + [ { | ( ) ^ $ должна предшествовать левая наклонная черта, чтобы они воспринимались как литеральные. Например, \. — это литеральная точка, а \\ — литеральная левая наклонная. Экранирования можно избежать, если использовать \Q...\E. Например: \QЛитеральный текст\E.

Внутри регулярного выражения специальные символы, такие как табуляция и новая строка, могут экранироваться либо акцентом (`), либо левой наклонной чертой (\). Например, `t — то же самое, что \t.

Основы синтаксиса регулярных выражений описаны в статье Регулярные выражения (RegEx) - краткий справочник

Примеры

NewStr := RegExReplace("abc123123", "123$", "xyz") ; Вернёт "abc123xyz", т.к. $ привязывает шаблон к концу строки. NewStr := RegExReplace("abc123", "i)^ABC") ; Вернёт "123", т.к. благодаря опции i регистр не учитывается. NewStr := RegExReplace("abcXYZ123", "abc(.*)123", "aaa$1zzz") ; Вернёт "aaaXYZzzz" за счёт вставки найденной ; подстроки по обратной ссылке $1. NewStr := RegExReplace("abc123abc456", "abc\d+", "", ReplacementCount) ; Вернёт "" и поместит 2 в ReplacementCount.
Теги страницы: