我遇到了RegEx和Delphi 2k9(Win32)的问题。我收到以下错误: $ 7C812AFB的首次机会异常。消息'TPerlRegEx.Compile()的异常类异常 - 请在RegEx中指定正则表达式'。 我从网站上获得了最新版本的TPerlRegEx。使用其defualt设置(使用DLL)
我包括演示源代码。它使用RegExBuddy生成的代码,最新版本。
http://www.4shared.com/file/236428923/97478b61/googleresultstestdata.html
http://www.4shared.com/file/236439483/e0acbe6d/Unit2.html
德尔福表格
http://www.4shared.com/file/236439473/6734a2a2/Unit2.html
Delphi PAS
感谢您的帮助
-Brad
数据来自Google外部关键字工具 RegEx可以使用一些细化......但是在RegExBuddy中工作不在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 =
答案 0 :(得分:6)
运行时错误“TPerlRegEx.Compile() - 请先在RegEx中指定正则表达式”意味着您调用了TPerlRegEx.Compile或其他调用此方法的方法(例如TPerlRegEx.Match)而未设置TPerlRegEx.RegEx属性。您无法通过问题中的代码获得该错误。
您的文件Unit2.pas无法编译时出现错误“字符串文字可能包含最多255个元素”。这是RegexBuddy在生成Delphi代码时尚未考虑的问题。 (下一个免费的次要更新将会。)如果你手动将字符串拆分成短于255个字符的片段(例如'longstring'变成'long'+'string'),那么代码就会运行。但它没有找到任何匹配。
为了让你的代码找到匹配项,我让它从磁盘加载你的文件googleresultstestdata.txt而不是使用备忘录来确保备忘录的自动换行不会在文本中添加任何换行符。我还从正则表达式中删除了#13的所有实例。您的文件googleresultstestdata.txt使用的UNIX样式换行符仅与\ n或#10匹配。 \ r \ n或#13#10匹配Windows风格的换行符。
在Delphi字符串中,#13
表示CR,#10
表示LF。在正则表达式中使用文字换行符绝对没有问题。如果您在RegexBuddy中输入文字换行符,那么RegexBuddy会在Delphi中将其编码为#13#10
。如果您在RegexBuddy中键入\r\n
,则RegexBuddy会在Delphi中将其编码为'\r\n'
。 PCRE(由TPerlRegEx内部使用)将\ r和\ n解释为CR和LF。
您的正则表达式使用冗余捕获组。 (?<name>(.*?))
将.*?
置于编号的捕获组内,并将其置于命名的capturng组“name”中。这样做没有意义。如果您想要命名组,只需使用(?<name>.*?)
这不会影响正则表达式匹配的内容,但会影响其性能。但更大的问题是.*?
所有{{}}}都会产生catastrophic backtracking。这是否值得关注取决于您将如何使用正则表达式。如果您只在自己的数据上使用它并且它不会导致问题,您可以保留它。但是,如果这是进入处理用户提供的数据的应用程序,那么如果它不能与用户的数据匹配,那么你需要一个优雅失败的正则表达式。
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.
答案 1 :(得分:4)
不熟悉Delphi,我无法理解你的Delphi风格的正则表达式,所以我回到RegexBuddy来重新创建它。这是我原来的:
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>.*$)
...这里是Delphi-string版本RegexBuddy生成:
'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>.*$)'
我用正则表达式看到的最大问题是:'#13#10'
。我不熟悉Delphi语法,但这是我能看到的唯一可能使正则表达式无法编译的东西。 RegexBuddy似乎认为\r\n
会起作用,但我通过使用\s*
代替了这个问题;无论如何都是用逗号分隔字段的逗号,而不是换行符。
我还摆脱了命名组内的多余括号;除非TPerlRegEx与其他口味完全不同,否则它们只是杂乱无章。这个正则表达式适合你吗?