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.
ModifierR¶
Модификатор /г, «расширение русского диапазона», инициализируется значением RegExprModifierR.
модификаторы¶
Модификатор /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.
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
).