English Русский Deutsch Български Français Español

TRegExpr

Реализует регулярные выражения в чистом паскале. Совместим с Free Pascal, Delphi 2-7, Borland C ++ Builder 3-6.

Для использования скопируйте в свой проект файлы «regexpr.pas», «regexpr_unicodedata.pas», «regexpr_compilers.inc».

Библиотека уже включена в Lazarus (Free Pascal) проект, поэтому вам не нужно ничего копировать, если вы используете Lazarus.

Класс TRegExpr

VersionMajor, VersionMinor

Вернуть мажорную и минорную версию, например, version 0.944.

VersionMajor = 0
VersionMinor = 944

Expression

Регулярное выражение.

Для оптимизации регулярное выражение автоматически компилируется в P-код. Читаемую человеком форму P-кода возвращает Dump.

В случае каких-либо ошибок при компиляции вызывается метод Error (по умолчанию Error вызывает исключение ERegExpr).

ModifierStr

Установить или получить значения модификаторов регулярных выражений.

Формат строки такой же, как в (? Ismx-ismx). Например, ModifierStr: = 'i-x' включит модификатор /i, выключит /x и оставит без изменений другие.

Если вы попытаетесь установить неподдерживаемый модификатор, будет вызвано Error.

ModifierI

Модификатор /i, «регистро-нечуствительный», инициализируется значением RegExprModifierI.

модификаторы

Модификатор /s, «однострочный текст», инициализируется значением RegExprModifierS.

ModifierG

Модификатор /g, «жадность», инициализируется значением RegExprModifierG.

ModifierM

Модификатор /m, «многострочный текст», инициализируется значением RegExprModifierM.

ModifierX

Модификатор /x, «расширенный синтаксис», инициализируется значением RegExprModifierX.

Exec

Ищет регулярное выражение в AInputString.

Доступна перегруженная версия Exec без AInputString - она использует AInputString из предыдущего вызова.

Смотрите также глобальную функцию ExecRegExpr, которую вы можете использовать без явного создания объекта TRegExpr.

ExecNext

Ищет следующее совпадение. Если ABackward = True то ищет в обратном направлении.

Без параметра работает так же:

if MatchLen [0] = 0
  then ExecPos (MatchPos [0] + 1)
  else ExecPos (MatchPos [0] + MatchLen [0]);

Вызывает исключение, если используется без предшествующего успешного вызова Exec, ExecPos или ExecNext.

Таким образом, вы всегда должны использовать что-то вроде:

if Exec (InputString)
  then
    repeat
      { Обработка }
    until not ExecNext;

ExecPos

Находит совпадение для InputString, начиная с позиции AOffset (нумерация с 1).

Параметр ABackward включает поиск от позиции AOffset к 1й позиции в тексте, то есть назад.

ATryOnce означает что совпадение проверяется только для начальной позиции, без смещения с нее.

Строка ввода

Возвращает текущую входную строку (из последнего вызова Exec или последнего присвоения этому свойству).

Любое присвоение этому свойству очищает Match, MatchPos и MatchLen.

Substitute

function Substitute (const ATemplate : RegExprString) : RegExprString;

Возвращает ATemplate, где $& или``$0`` заменяются на совпавший текст, а $1 по $9 заменяются на группу (подвыражение) с соответствующим номером с 1 по 9.

Чтобы поместить в шаблон символы $ или \, используйте префикс \, например \\ или \$.

условное обозначение описание
$& полное совпадение регулярного выражения
$0 полное совпадение регулярного выражения
$1 .. $9 совпадение нумерованных групп 1 .. 9
\n для Windows \r\n
\l следующий символ перевести в нижний регистр
\L делает строчными все символы после этого
\u делает заглавным один следующий символ
\U делает заглавными все символы после этого
'1\$ is $2\\rub\\' -> '1$ это <Match[2]>\rub\'
'\U$1\\r' преобразуется '<Match[1] в верхнем регистре>\r'

Если вы хотите поместить необработанную цифру после n, вы должны разделить n фигурными скобками {}.

'a$12bc' -> 'a<Match[12]>bc'
'a${1}2bc' -> 'a<Match[1]>2bc'.

Чтобы использовать найденные группы используется синтаксис ${name}, where name это номер найденной группы.

Split

Разделяет AInputStr на APieces по найденным регулярным выражениям.

Внутренне вызывает Exec / ExecNext

Смотрите также глобальную функцию SplitRegExpr, которую вы можете использовать без явного создания объекта TRegExpr.

Replace, ReplaceEx

function Replace (Const AInputStr : RegExprString;
  const AReplaceStr : RegExprString;
  AUseSubstitution : boolean= False)
 : RegExprString; overload;

function Replace (Const AInputStr : RegExprString;
  AReplaceFunc : TRegExprReplaceFunction)
 : RegExprString; overload;

function ReplaceEx (Const AInputStr : RegExprString;
  AReplaceFunc : TRegExprReplaceFunction):
  RegExprString;

Возвращает строку с повторениями, замененными строкой замены.

Если последний аргумент (AUseSubstitution) равен true, то AReplaceStr будет использоваться в качестве шаблона для методов подстановки.

Expression := '((?i)block|var)\s*(\s*\([^ ]*\)\s*)\s*';
Replace ('BLOCK( test1)', 'def "$1" value "$2"', True);

Возвращает def "BLOCK" value "test1"

Replace ('BLOCK( test1)', 'def "$1" value "$2"', False)

Возвращает def "$1" value "$2"

Внутренне вызывает Exec / ExecNext

Перегруженная версия ReplaceEx работающая с функцией обратного вызова, чтобы реализовать сложную функциональность.

Смотрите также глобальную функцию ReplaceRegExpr, которую вы можете использовать без явного создания объекта TRegExpr.

SubExprMatchCount

Количество подвыражений, которое было найдено в последнем вызове Exec / ExecNext.

Если нет подвыражений но было найдено все выражение (Exec* вернул True), то SubExprMatchCount=0, если ни подвыражений, ни всего выражения не найдено (Exec / ExecNext вернул false), тогда SubExprMatchCount=-1.

Обратите внимание, что некоторые группы (подвыражения) могут быть не найдены и для таких групп MathPos=MatchLen=-1 и Match=’’.

Expression := '(1)?2(3)?';
Exec ('123'): SubExprMatchCount=2, Match[0]='123', [1]='1', [2]='3'

Exec ('12'): SubExprMatchCount=1, Match[0]='12', [1]='1'

Exec ('23'): SubExprMatchCount=2, Match[0]='23', [1]='', [2]='3'

Exec ('2'): SubExprMatchCount=0, Match[0]='2'

Exec ('7') - return False: SubExprMatchCount=-1

MatchPos

Позиция группы (начиная с 1). Результат имеет смысл только после того как выражение было найдено. Первая группа имеет номер 1. Совпадение регулярного выражения в целом имеет номер 0.

Возвращает -1, если группа с указанным номером не была найдена.

MatchLen

Длина группы с указанным номером. Результат имеет смысл только после того, как выражение было найдено. У первой группы номер 1, у выражения в целом номер 0.

Возвращает -1, если группа с указанным номером не была найдена.

Match

Строка совпавшая с группой с указанным номером. Первая группа имеет номер 1, все выражение имеет номер 0. Возвращает пустую строку, если указанная группа не была найдена.

MatchIndexFromName

Возвращает индекс группы (начиная с 1) по имени группы, необходимом для именованных групп. Или -1 если такой именованной группы не найдено.

LastError

Возвращает ID последней ошибки, 0, если ошибок нет (невозможно использовать, если метод Error вызывает исключение) и очищает внутренний статус в 0 (без ошибок).

ErrorMsg

Возвращает сообщение об ошибке Error с ID = AErrorID.

CompilerErrorPos

Возвращает позицию в регулярном выражении, где компилятор остановился.

Полезно для диагностики ошибок.

SpaceChars

Содержит символы, которые рассматриваются как \s (изначально заполнены глобальной константой RegExprSpaceChars).

WordChars

Содержит символы, которые рассматриваются как \w (изначально заполнены глобальной константой RegExprWordChars).

LineSeparators

разделители строк (например, \n в Unix), изначально заполненные глобальной константой RegExprLineSeparators).

смотрите также Разделители строк

UseLinePairedBreak

Булево свойство, включает поиск парных разделителей строк CR LF.

смотрите также Разделители строк

Например, если вам нужно поведение в стиле Unix, присвойте LineSeparators: = #$a и LinePairedSeparator: = '' (пустая строка).

Если вы хотите принять в качестве разделителей строк только \x0D \ x0A, но не \x0D или \x0A, тогда присвойте LineSeparators: = '' (пустая строка) и UseLinePairedBreak := True.

По умолчанию используется смешанный режим (определенный в глобальных константах RegExprLineSeparators):

LineSeparators := #$d#$a;
UseLinePairedBreak := True;

Поведение этого режима подробно описано в Разделителях строк.

Compile

Компилирует регулярное выражение.

Полезно, например, для редакторов регулярных выражений в графическом интерфейсе - для проверки регулярных выражений без их использования.

Dump

Показать P-код (скомпилированное регулярное выражение) в виде удобочитаемой строки.

Глобальные константы

EscChar

Escape-char, по умолчанию \.

SubstituteGroupChar

Символ, используемый для указания группы (именованной или нумерованной) в методе Substitute, по умолчанию '$'.

RegExprModifierI

Модификатор i значение по умолчанию.

RegExprModifierR

Модификатор r значение по умолчанию.

RegExprModifierS

Модификатор s значение по умолчанию.

RegExprModifierG

Модификатор g значение по умолчанию.

RegExprModifierM

Модификатор m значение по умолчанию.

RegExprModifierX

Модификатор х значение по умолчанию.

RegExprSpaceChars

По умолчанию для свойства SpaceChars.

RegExprWordChars

Значение по умолчанию для свойства WordChars.

RegExprLineSeparators

Значение по умолчанию для свойства LineSeparators.

Глобальные функции

Вся эта функциональность доступна как методы TRegExpr, но с глобальными функциями вам не нужно создавать экземпляр TReExpr, поэтому ваш код будет более простым, если вам просто понадобится одна функция.

ExecRegExpr

Значение True, если строка соответствует регулярному выражению. Так же, как Exec в TRegExpr.

SplitRegExpr

Разбивает строку по регулярным выражениям. Смотрите также Split, если вы предпочитаете явно создавать экземпляр TRegExpr.

ReplaceRegExpr

function ReplaceRegExpr (
    const ARegExpr, AInputStr, AReplaceStr : RegExprString;
    AUseSubstitution : boolean= False
) : RegExprString; overload;

Type
  TRegexReplaceOption = (rroModifierI,
                         rroModifierR,
                         rroModifierS,
                         rroModifierG,
                         rroModifierM,
                         rroModifierX,
                         rroUseSubstitution,
                         rroUseOsLineEnd);
  TRegexReplaceOptions = Set of TRegexReplaceOption;

function ReplaceRegExpr (
    const ARegExpr, AInputStr, AReplaceStr : RegExprString;
    Options :TRegexReplaceOptions
) : RegExprString; overload;

Возвращает строку с регулярными выражениями, замененными на AReplaceStr. Смотрите также Replace, если вы предпочитаете создавать экземпляр TRegExpr явно.

Если последний аргумент (AUseSubstitution) равен True, то AReplaceStr будет использоваться в качестве шаблона для методов подстановки:

ReplaceRegExpr (
  '((?i)block|var)\s*(\s*\([^ ]*\)\s*)\s*',
  'BLOCK(test1)',
  'def "$1" value "$2"',
  True
)

Возвращает def 'BLOCK' value 'test1'

Но этот (обратите внимание, что нет последнего аргумента):

ReplaceRegExpr (
  '((?i)block|var)\s*(\s*\([^ ]*\)\s*)\s*',
  'BLOCK(test1)',
  'def "$1" value "$2"'
)

Возвращает def "$1" value "$2"

Версия с опциями

С Options вы управляете поведением \n (если rroUseOsLineEnd, то \n заменяется на \n\r в Windows и \n в Linux). И так далее.

Type
  TRegexReplaceOption = (rroModifierI,
                         rroModifierR,
                         rroModifierS,
                         rroModifierG,
                         rroModifierM,
                         rroModifierX,
                         rroUseSubstitution,
                         rroUseOsLineEnd);

QuoteRegExprMetaChars

Замените все мета-символы их безопасным представлением, например, abc'cd.( преобразуется в abc\'cd\.\(

Эта функция полезна для повторной автогенерации из пользовательского ввода.

RegExprSubExpressions

Составляет список подвыражений, найденных в ARegExpr.

В ASubExps каждый элемент представляет подвыражение, от первого до последнего, в формате:

String - текст подвыражения (без „()“)

Младшее слово Object - начальная позиция в ARegExpr, включая ‘(’ если существует! (первая позиция 1)

Старшее слово Object - длина, включая начало ‘(’ и окончание‘)’ , если существует!

AExtendedSyntax - должно быть True, если модификатор /x будет On при использовании r.e.

Полезно для графических редакторов и т. д. (пример использования можно найти в REStudioMain.pas)

Код результата Имея в виду
0 Успех. Не найдено несбалансированных скобок.
-1 Недостаточно закрывающих скобок ).
-(п+1) В позиции n было найдено открытие [ без соответствующего закрытия ].
N В позиции n была найдена закрывающая скобка ) без соответствующего открывания (.

Если Result <> 0, то ASubExprs может содержать пустые или недопустимые элементы.

ERegExpr

ERegExpr = class (Exception)
  public
   ErrorCode : integer; // error code. Ошибка компиляции менее 1000
   CompilerErrorPos : integer; // Позиция в которой найдена ошибка
 end;

Unicode

В режиме юникода все строки (InputString, Expression и пр.) будут типа UnicodeString/WideString, а не «string». Режим юникода замедляет работу, если он вам не нужен, лучше его не включать.

Чтобы использовать Unicode раскомментируйте {$DEFINE UniCode} в regexpr.pas (удалить off).