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\('(?P<keyword>(.*?))', (?P<number1>(.*?)),'#13#10'''(?P<localsearch>(.*?))'', ''(?P<globalsearch>(.*?))'', (?P<localsearchnum>(.*?)), (?P<globalsearchnum>(.*?)), (.*+)'#13#10','#13#10''\$(?P<price>(.*?))', (?P<number2>(.*?)),'#13#10''(?P<range>(.*?))', (?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 = '
''sensei_keyword'; var '
'historicalTimePeriod = 'Mar '
'2009 - Feb 2010'; var '
'historicalStartMonth = 2; var '
'impressionTimePeriod = '
''February'; 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('thunderstorm'
'9;, 1.9117305278778076,'
#39'201,000'#39', '#39'550,000'#39', 201000, '
'550000, 0.8666667'
','
''$0.49', 493102,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'5'
','
''''
','
'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('[thunderstorm]&'
'#39;, 1.9117305278778076,'
#39'33,100'#39', '#39'90,500'#39', 33100, 90500, '
'0.8666667'
','
''$0.49', 493102,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'3'
','
''''
','
'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('\42thunderstorm\'
'042', 1.9117305278778076,'
#39'201,000'#39', '#39'450,000'#39', 201000, '
'450000, 0.8666667'
','
''$0.49', 493102,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'5'
','
''''
','
'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('thunderstorms&#'
'39;, 1.8268921375274658,'
#39'110,000'#39', '#39'201,000'#39', 110000, '
'201000, 0.8'
','
''$0.56', 559074,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'4'
','
''''
','
'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('[thunderstorms]&'
'#39;, 1.8268921375274658,'
#39'22,200'#39', '#39'40,500'#39', 22200, 40500, '
'0.8'
','
''$0.56', 559074,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'4'
','
''''
','
'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('\42thunderstorms'
'\042', 1.8268921375274658,'
#39'110,000'#39', '#39'165,000'#39', 110000, '
'165000, 0.8'
','
''$0.56', 559074,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'4'
','
''''
','
'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('lightning '
'storm', 1.774579644203186,'
#39'49,500'#39', '#39'90,500'#39', 49500, 90500, '
'0.73333335'
','
''$0.54', 535666,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'5'
','
''''
','
'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('[lightning '
'storm]', 1.774579644203186,'
#39'12,100'#39', '#39'22,200'#39', 12100, 22200, '
'0.73333335'
','
''$0.54', 535666,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'5'
','
''''
','
'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('\42lightning '
'storm\042', '
'1.774579644203186,'
#39'33,100'#39', '#39'60,500'#39', 33100, 60500, '
'0.73333335'
','
''$0.54', 535666,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'5'
','
''''
','
'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('rain storm', '
'1.7464053630828857,'
#39'27,100'#39', '#39'49,500'#39', 27100, 49500, '
'0.6666667'
','
''$0.53', 526334,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'0'
','
''''
','
'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('[rain '
'storm]', '
'1.7464053630828857,'
#39'5,400'#39', '#39'8,100'#39', 5400, 8100, '
'0.6666667'
','
''$0.53', 526334,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'2'
','
''''
','
'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('\42rain '
'storm\042', '
'1.7464053630828857,'
#39'14,800'#39', '#39'27,100'#39', 14800, 27100, '
'0.6666667'
','
''$0.53', 526334,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'0'
','
''''
','
'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('lightning '
'storms', '
'1.6842896938323975,'
#39'14,800'#39', '#39'27,100'#39', 14800, 27100, '
'0.73333335'
','
''$0.42', 417108,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'4'
','
''''
','
'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('[lightning '
'storms]', '
'1.6842896938323975,'
#39'3,600'#39', '#39'8,100'#39', 3600, 8100, '
'0.73333335'
','
''$0.42', 417108,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'4'
','
''''
','
'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('\42lightning '
'storms\042', '
'1.6842896938323975,'
#39'12,100'#39', '#39'22,200'#39', 12100, 22200, '
'0.73333335'
','
''$0.42', 417108,'
''1 - 3', 2'
','
'0'
','
'0'
','
'monthlyVariation,'
'4'
','
''''
','
'kpView.MATCH_PHRASE'
','
'0'
')); var monthlyVariation =
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\('(?P<keyword>(.*?))', (?P<number1>(.*?)),' +
#10'''(?P<localsearch>(.*?))'', ''(?P<globalsearch>(.*?))'', (?P<localsearchnum>(.*?)), (?P<globalsearchnum>(.*?)), (.*+)'#10','#10''\$(?P<price>(.*?))', (?P<number2>(.*?)),'#10''(?P<range>(.*?))', (?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.
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\(
'(?P<keyword>.*?)',
\s*(?P<number1>.*?),
\s*'(?P<localsearch>.*?)',
\s*'(?P<globalsearch>.*?)',
\s*(?P<localsearchnum>.*?),
\s*(?P<globalsearchnum>.*?),
[^,]*,
\s*'\$(?P<price>.*?)',
\s*(?P<number2>.*?),
\s*'(?P<range>.*?)',
\s*(?P<number3>.*$)
...and here's Delphi-string version RegexBuddy generates:
'criteria\.push\(new\s+kpCriterion\(
'(?P<keyword>.*?)',
\s*(?P<number1>.*?),
\s*''(?P<localsearch>.*?)'',
\s*''(?P<globalsearch>.*?)'',
\s*(?P<localsearchnum>.*?),
\s*(?P<globalsearchnum>.*?),
[^,]*,
\s*'\$(?P<price>.*?)',
\s*(?P<number2>.*?),
\s*'(?P<range>.*?)',
\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?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With