Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi - TPerlRegEx / RegExBuddy Problem

I've got a problem with RegEx and Delphi 2k9 (Win32). I get the following Error: First chance exception at $7C812AFB. Exception class Exception with message 'TPerlRegEx.Compile() - Please specify a regular expression in RegEx first'. I've got the latest version of TPerlRegEx from the website. Using its defualt settings (Using DLL)

I'm including demo source code. It's using the code generated by RegExBuddy, latest version.

http://www.4shared.com/file/236428923/97478b61/googleresultstestdata.html http://www.4shared.com/file/236439483/e0acbe6d/Unit2.html Delphi FORM http://www.4shared.com/file/236439473/6734a2a2/Unit2.html Delphi PAS

Thanks for any help

-Brad

Data is from Google External Keyword Tool RegEx could use some refinement... but works in RegExBuddy not in Delphi

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, PerlRegEx;

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
 Regex: TPerlRegEx;
 GroupIndex: Integer;
begin
Regex := TPerlRegEx.Create(nil);
Regex.RegEx := 'criteria\.push\(new kpCriterion\(&#39;(?P<keyword>(.*?))&#39;, (?P<number1>(.*?)),'#13#10'''(?P<localsearch>(.*?))'', ''(?P<globalsearch>(.*?))'', (?P<localsearchnum>(.*?)), (?P<globalsearchnum>(.*?)), (.*+)'#13#10','#13#10'&#39;\$(?P<price>(.*?))&#39;, (?P<number2>(.*?)),'#13#10'&#39;(?P<range>(.*?))&#39;, (?P<number3>(.*+))';
Regex.Options := [preMultiLine];
Regex.Subject := memo1.text;
if Regex.Match then begin
  memo2.Lines.Add('Matches Found');
 repeat
  for GroupIndex := 0 to Regex.SubExpressionCount do begin
         memo2.lines.add( Regex.SubExpressions[GroupIndex]); //Add Results to memo
   // backreference text: Regex.SubExpressions[GroupIndex];
   // backreference start: Regex.SubExpressionOffsets[GroupIndex];
   // backreference length: Regex.SubExpressionLengths[GroupIndex];
  end;
 until not Regex.MatchAgain;
end
else
memo2.Lines.Add('No-Matches Found');
end;

end.

DFM

object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 247
  ClientWidth = 480
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Memo1: TMemo
    Left = 8
    Top = 8
    Width = 185
    Height = 89
    Lines.Strings = (
      'var showImpressions = false; var '
      'criteriaSuggestor = '
      '&#39;sensei_keyword&#39;; var '
      'historicalTimePeriod = &#39;Mar '
      '2009 - Feb 2010&#39;; var '
      'historicalStartMonth = 2; var '
      'impressionTimePeriod = '
      '&#39;February&#39;; var '
      'criteriaGroupsArray = new Array(); '
      'var captchaError = false; var '
      'quotaExceeded = false;'
      'var criteria = new Array();'
      'var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.52'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.67'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.82'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.73'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.5'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.45'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.45'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.43'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.4'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.47'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.45'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;thunderstorm&#3'
      '9;, 1.9117305278778076,'
      #39'201,000'#39', '#39'550,000'#39', 201000, '
      '550000, 0.8666667'
      ','
      '&#39;$0.49&#39;, 493102,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '5'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_BROAD'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.57'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.7'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.57'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.45'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.42'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.47'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.46'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.43'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.36'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.45'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.43'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;[thunderstorm]&'
      '#39;, 1.9117305278778076,'
      #39'33,100'#39', '#39'90,500'#39', 33100, 90500, '
      '0.8666667'
      ','
      '&#39;$0.49&#39;, 493102,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '3'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_EXACT'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.52'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.67'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.82'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.73'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.5'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.45'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.45'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.43'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.4'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.47'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.45'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;\42thunderstorm\'
      '042&#39;, 1.9117305278778076,'
      #39'201,000'#39', '#39'450,000'#39', 201000, '
      '450000, 0.8666667'
      ','
      '&#39;$0.49&#39;, 493102,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '5'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_PHRASE'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.75'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.81'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.87'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.64'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.56'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.52'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.6'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.53'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.47'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.58'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.61'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;thunderstorms&#'
      '39;, 1.8268921375274658,'
      #39'110,000'#39', '#39'201,000'#39', 110000, '
      '201000, 0.8'
      ','
      '&#39;$0.56&#39;, 559074,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '4'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_BROAD'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.83'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.82'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.67'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.42'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.41'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.47'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.56'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.47'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.39'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.5'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.51'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;[thunderstorms]&'
      '#39;, 1.8268921375274658,'
      #39'22,200'#39', '#39'40,500'#39', 22200, 40500, '
      '0.8'
      ','
      '&#39;$0.56&#39;, 559074,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '4'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_EXACT'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.75'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.81'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.87'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.64'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.56'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.52'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.6'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.53'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.47'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.58'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.61'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;\42thunderstorms'
      '\042&#39;, 1.8268921375274658,'
      #39'110,000'#39', '#39'165,000'#39', 110000, '
      '165000, 0.8'
      ','
      '&#39;$0.56&#39;, 559074,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '4'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_PHRASE'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.71'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.73'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.82'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.87'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.92'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.82'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.7'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.75'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.68'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.77'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.79'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;lightning '
      'storm&#39;, 1.774579644203186,'
      #39'49,500'#39', '#39'90,500'#39', 49500, 90500, '
      '0.73333335'
      ','
      '&#39;$0.54&#39;, 535666,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '5'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_BROAD'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.76'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.87'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.97'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.87'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.98'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.87'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.84'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.68'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.86'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.81'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;[lightning '
      'storm]&#39;, 1.774579644203186,'
      #39'12,100'#39', '#39'22,200'#39', 12100, 22200, '
      '0.73333335'
      ','
      '&#39;$0.54&#39;, 535666,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '5'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_EXACT'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.68'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.72'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.81'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.85'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.92'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.81'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.67'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.71'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.65'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.76'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.73'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;\42lightning '
      'storm\042&#39;, '
      '1.774579644203186,'
      #39'33,100'#39', '#39'60,500'#39', 33100, 60500, '
      '0.73333335'
      ','
      '&#39;$0.54&#39;, 535666,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '5'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_PHRASE'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.69'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.69'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.71'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.66'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.68'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.7'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.75'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.79'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.74'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.72'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.7'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;rain storm&#39;, '
      '1.7464053630828857,'
      #39'27,100'#39', '#39'49,500'#39', 27100, 49500, '
      '0.6666667'
      ','
      '&#39;$0.53&#39;, 526334,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '0'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_BROAD'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.87'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.79'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.57'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.55'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.57'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.74'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.76'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.69'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.61'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.89'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.73'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;[rain '
      'storm]&#39;, '
      '1.7464053630828857,'
      #39'5,400'#39', '#39'8,100'#39', 5400, 8100, '
      '0.6666667'
      ','
      '&#39;$0.53&#39;, 526334,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '2'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_EXACT'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.73'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.7'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.68'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.61'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.68'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.69'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.73'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.72'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.62'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.59'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.66'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;\42rain '
      'storm\042&#39;, '
      '1.7464053630828857,'
      #39'14,800'#39', '#39'27,100'#39', 14800, 27100, '
      '0.6666667'
      ','
      '&#39;$0.53&#39;, 526334,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '0'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_PHRASE'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.82'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.87'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.78'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.82'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.84'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.79'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.77'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.61'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.92'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.82'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;lightning '
      'storms&#39;, '
      '1.6842896938323975,'
      #39'14,800'#39', '#39'27,100'#39', 14800, 27100, '
      '0.73333335'
      ','
      '&#39;$0.42&#39;, 417108,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '4'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_BROAD'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.9'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.9'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.84'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.7'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.81'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.88'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.77'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.76'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.57'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.75'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.63'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;[lightning '
      'storms]&#39;, '
      '1.6842896938323975,'
      #39'3,600'#39', '#39'8,100'#39', 3600, 8100, '
      '0.73333335'
      ','
      '&#39;$0.42&#39;, 417108,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '4'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_EXACT'
      ','
      '0'
      ')); var monthlyVariation = new '
      'Array();'
      'monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.8'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.86'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '1.0'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.99'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.77'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.83'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.85'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.78'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.77'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.6'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.91'
      ')); monthlyVariation.push(new '
      'kpMonthlyPopularity('
      '0.81'
      '));'
      'criteria.push(new '
      'kpCriterion(&#39;\42lightning '
      'storms\042&#39;, '
      '1.6842896938323975,'
      #39'12,100'#39', '#39'22,200'#39', 12100, 22200, '
      '0.73333335'
      ','
      '&#39;$0.42&#39;, 417108,'
      '&#39;1 - 3&#39;, 2'
      ','
      '0'
      ','
      '0'
      ','
      'monthlyVariation,'
      '4'
      ','
      '&#39;&#39;'
      ','
      'kpView.MATCH_PHRASE'
      ','
      '0'
      ')); var monthlyVariation =
like image 829
Brad Avatar asked Dec 29 '22 23:12

Brad


2 Answers

The runtime error "TPerlRegEx.Compile() - Please specify a regular expression in RegEx first" means you called TPerlRegEx.Compile or another method that calls this (such as TPerlRegEx.Match) without setting the TPerlRegEx.RegEx property. You can't get that error with the code in your question.

Your file Unit2.pas fails to compile with an error "string literals may have at most 255 elements". This is something that RegexBuddy does not yet take into account when generating Delphi code. (The next free minor update will.) If you manually split up the string into pieces shorter than 255 characters (e.g. 'longstring' becomes 'long' + 'string') then the code runs. It does not find any matches though.

To make your code find matches, I made it load your file googleresultstestdata.txt from disk instead of using the memo to make sure that the memo's word wrapping does not add any line breaks to the text. I also removed all instances of #13 from the regex. Your file googleresultstestdata.txt uses UNIX-style line breaks which are matched with \n or #10 only. \r\n or #13#10 matches Windows-style line breaks.

In Delphi strings, #13 represents CR and #10 represents LF. There is absolutely no problem with using literal line breaks in regular expressions. If you type a literal line break into RegexBuddy then RegexBuddy codes that as #13#10 in Delphi. If you type \r\n into RegexBuddy then RegexBuddy codes that as '\r\n' in Delphi. PCRE (used internally by TPerlRegEx) interprets \r and \n as CR and LF.

Your regex uses redundant capturing groups. (?<name>(.*?)) puts the .*? inside a numbered capturing group and that inside a named capturng group "name". There's no point in doing that. If you want the named group, just use (?<name>.*?)

This does not affect what your regex matches, but will affect its performance. A bigger problem though is that all those .*? can result in catastrophic backtracking. Whether this is a concern depends on how you'll be using the regex. If you're only using it on your own data and it doesn't cause problems, you can leave it. But if this is going into an application that handles user-provided data, then you'll need a regex that fails more gracefully if it can't match the user's data.

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, PerlRegEx;

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
    Regex: TPerlRegEx;
    GroupIndex: Integer;
  FS: TFileStream;
  S: UTF8String;
begin
  Regex := TPerlRegEx.Create(nil);
  Regex.RegEx := 'criteria\.push\(new kpCriterion\(&#39;(?P<keyword>(.*?))&#39;, (?P<number1>(.*?)),' +
                 #10'''(?P<localsearch>(.*?))'', ''(?P<globalsearch>(.*?))'', (?P<localsearchnum>(.*?)), (?P<globalsearchnum>(.*?)), (.*+)'#10','#10'&#39;\$(?P<price>(.*?))&#39;, (?P<number2>(.*?)),'#10'&#39;(?P<range>(.*?))&#39;, (?P<number3>(.*+))';
  Regex.Options := [preMultiLine];
  FS := TFileStream.Create('g:\temp\googleresultstestdata.txt', fmOpenRead);
  SetLength(S, FS.Size);
  FS.Read(S[1], Length(S));
  FS.Free;
  Regex.Subject := S;
  if Regex.Match then begin
    memo2.Lines.Add('Matches Found');
    repeat
      for GroupIndex := 0 to Regex.SubExpressionCount do begin
           memo2.lines.add( Regex.SubExpressions[GroupIndex]); //Add Results to memo
        // backreference text: Regex.SubExpressions[GroupIndex];
        // backreference start: Regex.SubExpressionOffsets[GroupIndex];
        // backreference length: Regex.SubExpressionLengths[GroupIndex];
      end;
    until not Regex.MatchAgain;
  end
  else
    memo2.Lines.Add('No-Matches Found');
end;

end.
like image 157
Jan Goyvaerts Avatar answered Dec 31 '22 14:12

Jan Goyvaerts


Not being acquainted with Delphi, I couldn't make sense of your Delphi-flavored regex, so I went back to RegexBuddy to recreate it. Here's my original:

criteria\.push\(new\s+kpCriterion\(
&#39;(?P<keyword>.*?)&#39;,
\s*(?P<number1>.*?),
\s*'(?P<localsearch>.*?)',
\s*'(?P<globalsearch>.*?)',
\s*(?P<localsearchnum>.*?),
\s*(?P<globalsearchnum>.*?),
[^,]*,
\s*&#39;\$(?P<price>.*?)&#39;,
\s*(?P<number2>.*?),
\s*&#39;(?P<range>.*?)&#39;,
\s*(?P<number3>.*$)

...and here's Delphi-string version RegexBuddy generates:

'criteria\.push\(new\s+kpCriterion\(
&#39;(?P<keyword>.*?)&#39;,
\s*(?P<number1>.*?),
\s*''(?P<localsearch>.*?)'',
\s*''(?P<globalsearch>.*?)'',
\s*(?P<localsearchnum>.*?),
\s*(?P<globalsearchnum>.*?),
[^,]*,
\s*&#39;\$(?P<price>.*?)&#39;,
\s*(?P<number2>.*?),
\s*&#39;(?P<range>.*?)&#39;,
\s*(?P<number3>.*$)'

I split them up for readability, obviously. To reassemble them, just remove the line breaks; there should be no literal whitespace of any kind in the regex.

The biggest problem I saw with your regex was this bit: '#13#10'. I'm not familiar with Delphi syntax, but that's the only thing I can see that might make the regex fail to compile. RegexBuddy seems to think \r\n will work, but I skirted the issue by using \s* instead; it's the commas that delimit the fields anyway, not the line breaks.

I also got rid of the redundant parentheses inside the named groups; unless TPerlRegEx is radically different from other flavors, they were just clutter. Does this regex work for you?

like image 34
Alan Moore Avatar answered Dec 31 '22 14:12

Alan Moore