首页 > 解决方案 > 检查字符串是否为正则表达式的其他方法

问题描述

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

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;

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

标签: delphidelphi-xe2

解决方案


如果您想使用这种方法,那么您将无法避免 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 中实现相同目标应该不会太难。


推荐阅读