简体   繁体   English

Delphi - TPerlRegEx / RegExBuddy问题

[英]Delphi - TPerlRegEx / RegExBuddy Problem

I've got a problem with RegEx and Delphi 2k9 (Win32). 我遇到了RegEx和Delphi 2k9(Win32)的问题。 I get the following Error: First chance exception at $7C812AFB. 我得到以下错误:$ 7C812AFB的第一次机会异常。 Exception class Exception with message 'TPerlRegEx.Compile() - Please specify a regular expression in RegEx first'. 消息'TPerlRegEx.Compile()的异常类异常 - 请在RegEx中指定正则表达式'。 I've got the latest version of TPerlRegEx from the website. 我从网站上获得了最新版本的TPerlRegEx。 Using its defualt settings (Using DLL) 使用其defualt设置(使用DLL)

I'm including demo source code. 我包括演示源代码。 It's using the code generated by RegExBuddy, latest version. 它使用RegExBuddy生成的代码,最新版本。

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 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 -Brad

Data is from Google External Keyword Tool RegEx could use some refinement... but works in RegExBuddy not in Delphi 数据来自谷歌外部关键字工具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\(&#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 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 =

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. 运行时错误“TPerlRegEx.Compile() - 请首先在RegEx中指定正则表达式”意味着您调用了TPerlRegEx.Compile或其他调用此方法的方法(例如TPerlRegEx.Match)而未设置TPerlRegEx.RegEx属性。 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". 你的文件Unit2.pas无法编译错误“字符串文字最多可包含255个元素”。 This is something that RegexBuddy does not yet take into account when generating Delphi code. 这是RegexBuddy在生成Delphi代码时尚未考虑的问题。 (The next free minor update will.) If you manually split up the string into pieces shorter than 255 characters (eg 'longstring' becomes 'long' + 'string') then the code runs. (下一个免费的次要更新将会。)如果你手动将字符串拆分成短于255个字符的部分(例如'longstring'变成'long'+'string'),那么代码就会运行。 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. 为了让你的代码找到匹配项,我让它从磁盘加载你的文件googleresultstestdata.txt而不是使用备忘录来确保备忘录的自动换行不会在文本中添加任何换行符。 I also removed all instances of #13 from the regex. 我还从正则表达式中删除了#13的所有实例。 Your file googleresultstestdata.txt uses UNIX-style line breaks which are matched with \\n or #10 only. 您的文件googleresultstestdata.txt使用的UNIX样式换行符仅与\\ n或#10匹配。 \\r\\n or #13#10 matches Windows-style line breaks. \\ r \\ n或#13#10匹配Windows风格的换行符。

In Delphi strings, #13 represents CR and #10 represents LF. 在Delphi字符串中, #13表示CR, #10表示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. 如果你在RegexBuddy中键入一个文字换行符,那么RegexBuddy将其编码为Delphi中的#13#10 If you type \\r\\n into RegexBuddy then RegexBuddy codes that as '\\r\\n' in Delphi. 如果你输入\\r\\n到RegexBuddy,那么RegexBuddy在Delphi中将其编码为'\\r\\n' PCRE (used internally by TPerlRegEx) interprets \\r and \\n as CR and LF. PCRE(由TPerlRegEx内部使用)将\\ r和\\ n解释为CR和LF。

Your regex uses redundant capturing groups. 您的正则表达式使用冗余捕获组。 (?<name>(.*?)) puts the .*? (?<name>(.*?))放入.*? 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>.*?) 如果你想要命名组,只需使用(?<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.

Not being acquainted with Delphi, I couldn't make sense of your Delphi-flavored regex, so I went back to RegexBuddy to recreate it. 不熟悉Delphi,我无法理解你的Delphi风格的正则表达式,所以我回到RegexBuddy来重新创建它。 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: ...这里是Delphi-string版本RegexBuddy生成的:

'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' . 我用你的正则表达式看到的最大问题是: '#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. 我不熟悉Delphi语法,但这是我能看到的唯一可能使正则表达式无法编译的东西。 RegexBuddy seems to think \\r\\n will work, but I skirted the issue by using \\s* instead; RegexBuddy似乎认为\\r\\n会起作用,但我通过使用\\s*代替了这个问题; 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. 除非TPerlRegEx与其他口味完全不同,否则它们只是杂乱无章。 Does this regex work for you? 这个正则表达式适合你吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM