检查字符串是否为正则表达式的其他方法
Other Ways to Check if String is a Regular Expression
我有这个函数来检查一个字符串是否是一个正则表达式并且它工作正常:
function IsValidRegEx(aString: string): Boolean;
var
aReg : TRegEx;
begin
Result := False;
if Trim(aString) = '' then
begin
Exit;
end;
try
aReg := TRegEx.Create(aString);
if aReg.IsMatch('asdf') then
begin
end;
Result := True;
except
end;
end;
问题是如果字符串值为 false,它总是会引发调试器异常通知。我想消除该通知。有一个选项可以忽略通知本身的异常,但我不想要它。尽可能地调整代码。
如果您想使用这种方法,则无法避免 Delphi 正则表达式库引发异常。您需要深入研究 Delphi 用于实现其正则表达式库的 PCRE 库。例如:
{$APPTYPE CONSOLE}
uses
System.RegularExpressionsAPI;
function IsValidRegEx(const Value: UTF8String): Boolean;
var
CharTable: Pointer;
Options: Integer;
Pattern: Pointer;
Error: PAnsiChar;
ErrorOffset: Integer;
begin
CharTable := pcre_maketables;
Options := PCRE_UTF8 or PCRE_NEWLINE_ANY;
Pattern := pcre_compile(PAnsiChar(Value), Options, @Error, @ErrorOffset, CharTable);
Result := Assigned(Pattern);
pcre_dispose(Pattern, nil, CharTable);
end;
begin
Writeln(IsValidRegEx('*'));
Writeln(IsValidRegEx('.*'));
Readln;
end.
请注意,我是用 Delphi XE7 编写的,因为我无权访问 XE2。如果此代码无法编译,那么研究 Delphi 正则表达式库的源代码以找出如何在 XE2 中实现相同的功能应该不会太难。
我有这个函数来检查一个字符串是否是一个正则表达式并且它工作正常:
function IsValidRegEx(aString: string): Boolean;
var
aReg : TRegEx;
begin
Result := False;
if Trim(aString) = '' then
begin
Exit;
end;
try
aReg := TRegEx.Create(aString);
if aReg.IsMatch('asdf') then
begin
end;
Result := True;
except
end;
end;
问题是如果字符串值为 false,它总是会引发调试器异常通知。我想消除该通知。有一个选项可以忽略通知本身的异常,但我不想要它。尽可能地调整代码。
如果您想使用这种方法,则无法避免 Delphi 正则表达式库引发异常。您需要深入研究 Delphi 用于实现其正则表达式库的 PCRE 库。例如:
{$APPTYPE CONSOLE}
uses
System.RegularExpressionsAPI;
function IsValidRegEx(const Value: UTF8String): Boolean;
var
CharTable: Pointer;
Options: Integer;
Pattern: Pointer;
Error: PAnsiChar;
ErrorOffset: Integer;
begin
CharTable := pcre_maketables;
Options := PCRE_UTF8 or PCRE_NEWLINE_ANY;
Pattern := pcre_compile(PAnsiChar(Value), Options, @Error, @ErrorOffset, CharTable);
Result := Assigned(Pattern);
pcre_dispose(Pattern, nil, CharTable);
end;
begin
Writeln(IsValidRegEx('*'));
Writeln(IsValidRegEx('.*'));
Readln;
end.
请注意,我是用 Delphi XE7 编写的,因为我无权访问 XE2。如果此代码无法编译,那么研究 Delphi 正则表达式库的源代码以找出如何在 XE2 中实现相同的功能应该不会太难。