4

我遇到了 RegEx 和 Delphi 2k9 (Win32) 的问题。我收到以下错误:$7C812AFB 的第一次机会异常。异常类异常,带有消息“TPerlRegEx.Compile() - 请先在 RegEx 中指定正则表达式”。我从网站上获得了最新版本的 TPerlRegEx。使用其默认设置(使用 DLL)

我包括演示源代码。它使用由 RegExBuddy 生成的代码,最新版本。

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

谢谢你的帮助

-布拉德

数据来自 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\(&#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 =
4

2 回答 2

6

运行时错误“TPerlRegEx.Compile() - 请先在 RegEx 中指定正则表达式”表示您调用了 TPerlRegEx.Compile 或其他调用此方法的方法(例如 TPerlRegEx.Match),但未设置 TPerlRegEx.RegEx 属性。您的问题中的代码不会出现该错误。

您的文件 Unit2.pas 无法编译并出现错误“字符串文字可能最多有 255 个元素”。这是 RegexBuddy 在生成 Delphi 代码时尚未考虑到的内容。(下一次免费的次要更新将。)如果您手动将字符串拆分为短于 255 个字符的部分(例如,“longstring”变为“long”+“string”),则代码运行。但它没有找到任何匹配项。

为了让您的代码找到匹配项,我让它从磁盘加载您的文件 googleresultstestdata.txt 而不是使用备忘录,以确保备忘录的自动换行不会在文本中添加任何换行符。我还从正则表达式中删除了 #13 的所有实例。您的文件 googleresultstestdata.txt 使用仅与 \n 或 #10 匹配的 UNIX 样式换行符。\r\n 或 #13#10 匹配 Windows 样式的换行符。

在 Delphi 字符串中,#13代表 CR,#10代表 LF。在正则表达式中使用文字换行符绝对没有问题。如果您在 RegexBuddy 中键入文字换行符,则 RegexBuddy 会像#13#10在 Delphi 中那样对其进行编码。如果您输入\r\nRegexBuddy,那么 RegexBuddy 会像'\r\n'在 Delphi 中那样进行编码。PCRE(由 TPerlRegEx 在内部使用)将 \r 和 \n 解释为 CR 和 LF。

您的正则表达式使用冗余捕获组。 (?<name>(.*?))将其.*?放入一个编号的捕获组,并将其放入一个命名的捕获组“名称”中。这样做没有意义。如果你想要命名组,只需使用(?<name>.*?)

这不会影响您的正则表达式匹配的内容,但会影响其性能。一个更大的问题是,所有这些.*?都可能导致灾难性的回溯。这是否是一个问题取决于您将如何使用正则表达式。如果您只是在自己的数据上使用它并且不会引起问题,则可以保留它。但是,如果这要进入处理用户提供的数据的应用程序,那么如果它不能匹配用户的数据,您将需要一个更优雅地失败的正则表达式。

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.
于 2010-03-08T12:29:46.113 回答
4

不熟悉 Delphi,我无法理解您的 Delphi 风格的正则表达式,所以我回到 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>.*$)

...这里是 RegexBuddy 生成的 Delphi 字符串版本:

'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>.*$)'

显然,我将它们分开是为了便于阅读。要重新组装它们,只需删除换行符;正则表达式中不应有任何类型的文字空格。

我在您的正则表达式中看到的最大问题是这一点:'#13#10'. 我不熟悉 Delphi 语法,但这是我能看到的唯一可能使正则表达式无法编译的东西。RegexBuddy 似乎认为\r\n会起作用,但我通过使用\s*来绕过这个问题;无论如何,它是分隔字段的逗号,而不是换行符。

我还去掉了命名组中多余的括号;除非 TPerlRegEx 与其他风格完全不同,否则它们只是杂乱无章。这个正则表达式对你有用吗?

于 2010-03-08T05:20:54.550 回答