anchor.diff:    end;
   end;
   
  +function SRegexMatchesString(const AStr, AStrRegex: string; ACaseSensitive: boolean): boolean;
  +var
  +  Obj: TRegExpr;
  +begin
  +  Result:= false;
  +  if AStr='' then exit;
  +  if AStrRegex='' then exit;
  +
  +  Obj:= TRegExpr.Create;
  +  try
  +    try
  +      Obj.ModifierS:= false;
  +      Obj.ModifierI:= not ACaseSensitive;
  +      Obj.Expression:= AStrRegex;
  +      Result:= Obj.Exec(AStr) and (Obj.MatchLen[0]=Length(AStr));
  +    except
  +    end;
  +  finally
  +    Obj.Free;
  +  end;
  +end;
  +
  +
   
   function SReadOptionFromJson(const fn, path, def_value: string): string;
   var
  
positive.code: end;
  
  function IsLexerListed(const ALexer, ANameList: string): boolean;
  begin
    if ANameList='' then exit(true);
    if ALexer='' then exit(false);
    Result:= Pos(
      ','+LowerCase(ALexer)+',',
      ','+LowerCase(ANameList)+',' )>0;
  end;
  
  function IsFilenameListedInExtensionList(const AFilename, AExtList: string): boolean;
  
negative.code: function SFindFuzzyPositions(SText, SFind: UnicodeString): TATIntArray;
  function SFindWordsInString(SText, SFind: string): boolean;
  function SRegexReplaceSubstring(const AStr, AStrFind, AStrReplace: string; AUseSubstitute: boolean): string;
  function SRegexMatchesString(const AStr, AStrRegex: string; ACaseSensitive: boolean): boolean;
  
  function IsLexerListed(const ALexer, ANameList: string): boolean;
  function IsFilenameListedInExtensionList(const AFilename, AExtList: string): boolean;
  