2016-04-04 15 views
1

ウェブページで特定の文字列を検索したいと思います。私はRegExを使うことにしました。 (私は私のRegExesがかなりひどいことを知っている、しかし、彼らは働く)。私の2つの表現は、メモ帳++(おそらく< 1秒)とRegex101で使用すると非常に高速ですが、AutoHotKeyで使用すると恐ろしく遅くなります。これをどうやって解決するのですか?AHKでRegExが非常に遅いが、メモ帳では高速です。++

sWindowInfo2 = http://www.archiwum.wyborcza.pl/Archiwum/1,0,4583161,20060208LU-DLO,Dzis_bedzie_Piast,.html 

whr := ComObjCreate("WinHttp.WinHttpRequest.5.1") 
whr.Open("GET", sWindowInfo2, false), whr.Send() 
whr.ResponseText 
sPage := "" 
sPage := whr.ResponseText 
; get city name (if exists) – the following is very slooooow 
if RegExMatch(sPage, "[\s\S]+<dzial>Gazeta\s(.+)<\/dzial>[\s\S]+") 
{ 
    sCity := RegExReplace(sPage, "[\s\S]+<dzial>Gazeta\s(.+)<\/dzial>[\s\S]+", "$1") 
    ;MsgBox, % sCity 
    city := 1 
} 
if RegExMatch(sPage, "[\s\S]+<metryczka>GW\s(.+)\snr[\s\S]+") 
{ 
    sCity := RegExReplace(sPage, "[\s\S]+<metryczka>GW\s(.+)\snr[\s\S]+", "$1") 
    city := 1 
} 

編集:私は試合はLublin提供されるページで 。見てください:https://regex101.com/r/qJ2pF8/1

+0

正規表現は正確に一致する必要がありますか?我々はそれらを改善することはできませんいくつかの例と一緒に! –

+0

ページのソースを開き、RegExを実行します。あなたは "ルブリン"を取得します。私が提供したリンクを使用することもできます。 – menteith

+0

この '[\ s \ S]'の代わりに '.'を使わないのはなぜですか? –

答えて

1

キャプチャ値を取得するためにRegExReplaceを使用する必要はありません。参照につき、あなたはRegExMatchに第三VARを渡すことができます。

OutputVar OutputVarはの引用符で囲まれていない位置を取得するために使用することができますマッチオブジェクトを格納するためにここで、変数の名前、長さ、および値であり、全体的な一致とそれぞれがサブパターンをキャプチャした場合は、です。

FoundPos := RegExMatch(sPage, "<metryczka>GW\s(.+)\snr", SubPat) ; 

それは試合の位置を返し、SubPat[1]で「ルブリン」を格納します:

だから、はるかに単純なパターンを使用します。

このパターンでは、[\s\S]+<metryczka>GW\s(.+)\snr[\s\S]+と最初の[\s\S]+が重複していることを回避し、その後のサブパターンに対応するためにバックトラックします。文字列が長ければ長いほど操作は遅くなります。

+1

パーフェクト!いつものように。私はそれを短くするために文字列を取り除き始めました(最初は〜80 kBでした)、この優れたソリューションを私に提供しました。私は最初の正規表現 '[\ s \ S] + Gazeta \ s(。+)<\/dzial> [\ s \ S] +'を ' Gazeta \ s(。+)<\/dzial>'に変更しました。 – menteith

関連する問題