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

TRegExpr

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

Чтобы использовать это просто скопируйте исходный код в ваш проект.

Библиотека уже включена в 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

Найти следующее совпадение.

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

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

AOffset = 1 // первый символ InputString

Строка ввода

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

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

Substitute

function Substitute (const ATemplate : RegExprString) : RegExprString;

Возвращает ATemplate с $& или $0, замененным целым регулярным выражением, а $n заменяется вхождением числа подвыражения n.

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

условное обозначение описание
$& полное совпадение регулярного выражения
$0 полное совпадение регулярного выражения
$N регулярное подвыражение n совпадение
\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'.

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 = &#39;&#39;.

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

позиция найденного подвыражения #Idx в строке после последнего Exec*. Первое подвыражение будет Idx=1, последнее - MatchCount, все выражение Idx=0.

Возвращает -1, если нет такого подвыражения или это подвыражение не найдено во входной строке.

MatchLen

длина найденного подвыражения #Idx в последнем Exec*. Первое подвыражение Idx=1, последнее - MatchCount, все выражение Idx=0.

Возвращает -1, если в такого подвыражения нет в выражении или оно не найдено во входной строке.

Match

Возвращает &#39;&#39;, если такого подвыражении нет или оно не найдено во входящей строке.

LastError

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

ErrorMsg

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

CompilerErrorPos

Возвращает pos в ре там компилятор остановился.

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

SpaceChars

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

WordChars

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

LineSeparators

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

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

LinePairedSeparator

разделитель парных строк (например, \r\n в DOS и Windows).

должен содержать ровно два символа или вообще не содержать символов, изначально заполненных глобальной константой RegExprLinePairedSeparator)

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

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

Если вы хотите принять в качестве разделителей строк только \x0D \ x0A, но не \x0D или \x0A, тогда присвойте LineSeparators: = &#39;&#39; (пустая строка) и LinePairedSeparator: = #$d#$a.

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

LineSeparators: = #$d#$a; LinePairedSeparator: = #$d#$a

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

InvertCase

Инвертирует регистр символов для регистро-независимого поиска. Переопределите, если хотите другое поведение.

Compile

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

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

Dump

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

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

EscChar

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

RegExprModifierI

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

RegExprModifierR

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

RegExprModifierS

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

RegExprModifierG

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

RegExprModifierM

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

RegExprModifierX

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

RegExprSpaceChars

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

RegExprWordChars

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

RegExprLineSeparators

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

RegExprLinePairedSeparator

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

RegExprInvertCaseFunction

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

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

Вся эта функциональность доступна как методы 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

UniCode замедляет производительность, поэтому используйте его, только если вам действительно нужна поддержка Unicode.

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

После этого все строки будут рассматриваться как WideString.