【问题标题】:Other Ways to Check if String is a Regular Expression检查字符串是否为正则表达式的其他方法
【发布时间】:2020-07-03 07:08:14
【问题描述】:

我有这个函数来检查一个字符串是否是一个正则表达式并且它工作正常:

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;

问题是如果字符串值为假,它总是会引发调试器异常通知。我想消除那个通知。有一个选项可以在通知本身中忽略该异常,但我不想要它。尽可能由代码来调整。

【问题讨论】:

  • 直接调用 Delphi 的正则表达式类后面的 PCRE 库不会太难,因此可以避免引发异常。这也将是您掩盖所有异常的代码的一大进步!

标签: delphi delphi-xe2


【解决方案1】:

如果您想使用这种方法,则无法避免 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 中实现同样的功能应该不会太难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2013-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多