2016-04-04 15 views
1

Bir web sayfasında belirli bir dize bulmak istiyorum. RegEx'i kullanmaya karar verdim. (RegExes'imin oldukça korkunç olduğunu biliyorum, ancak işe yarıyorlar). Benim iki ifadeler, Notepad ++ (muhtemelen < 1s) ve Regex101'da kullanıldığında çok hızlıdır, ancak AutoHotKey'de kullanıldığında korkunç derecede yavaştırlar - yaklaşık 2-5 dakika. Bunu nasıl düzeltirim?Çok yavaş RegEx AHK henüz hızlı Notepad ++

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 
} 

DÜZENLEME: eşleştiği sürece sayfasında Lublin olduğunu. Bir göz atın: https://regex101.com/r/qJ2pF8/1

+0

Düzenli ifadeler tam olarak eşleşmelidir? Onları geliştiremediğimiz bazı örnekler verin! –

+0

Sayfanın kaynağını açın ve RegEx'i çalıştırın. "Lublin" alacaksın. Sağladığım bağlantıyı da kullanabilirsiniz. – menteith

+0

Neden bu yerine [.] [\ S \ S] '' yi kullanmıyorsunuz? –

cevap

1

Yakalanan değeri almak için RegExReplace kullanmanız gerekmez. referans başına olarak, RegExMatch içine 3 Var geçebilir:

OutputVar OutputVar konumu, uzunluk ve değerini almak için kullanılabilen bir eşleşme nesnenin saklanması için olan bir değişken, bir işlem görmeyen adıdır Varsa, toplam eşleşmesi ve varsa alt kaput mevcut.

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

Bu maçın konumunu döndürür ve SubPat[1] yılında "Lublin" saklayacaktır:

Yani, çok daha basit bir desen kullanın.

Bu modelde, dizenin sonuna kadar eşleşen ilk [\s\S]+ ile [\s\S]+<metryczka>GW\s(.+)\snr[\s\S]+ ile yaptığınız yoğun bir geri izlemeden ve ardından sonraki alt şablonlara uyum sağlamak için geriye doğru izlemekten kaçınırsınız. Dize ne kadar uzun olursa operasyon o kadar yavaş olur.

+1

Mükemmel! Her zamanki gibi. Dizimi daha kısa yapmak için (başlangıçta ~ 80 kB) çıkarmaya başladım ve bana bu mükemmel çözümü sağladın. Başlangıcı RegEx 'i [\ s \ S] + Gazeta \ s (. +) <\/dzial> [\ s \ S] +' '' Gazeta \ s (. +) <\/dzial> 'olarak değiştirdim ve aynı zamanda kusursuz çalışıyor! – menteith