2016-04-04 9 views
1

Ich möchte eine bestimmte Zeichenfolge in einer Webseite finden. Ich entschied mich für RegEx. (Ich weiß, meine RegExes sind ziemlich schrecklich, aber sie arbeiten). Meine zwei Ausdrücke sind sehr schnell, wenn sie in Notepad ++ (wahrscheinlich < 1s) und Regex101 verwendet werden, aber sie sind schrecklich langsam, wenn sie in AutoHotKey verwendet werden - etwa 2-5 Minuten. Wie behebe ich das?Sehr langsam RegEx in AHK noch schnell in 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 
} 

EDIT: auf der Seite ich das Spiel vorgesehen ist Lublin. Sehen Sie sich an: https://regex101.com/r/qJ2pF8/1

+0

Was genau sollten die Regexe übereinstimmen? Aus einigen Beispielen können wir sie nicht verbessern! –

+0

Öffnen Sie die Quelle der Seite und führen Sie RegEx aus. Sie werden "Lublin" bekommen. Sie können auch den von mir bereitgestellten Link verwenden. – menteith

+0

Warum verwenden Sie nicht '.' anstelle von' [\ s \ S] '? –

Antwort

1

Sie müssen RegExReplace nicht verwenden, um den erfassten Wert zu erhalten.

OutputVar OutputVar ist der nicht notierten Namen einer Variablen, in dem ein Match-Objekt zu speichern, die verwendet werden können, um die Position, Länge und Wert zu erhalten: Wie pro Referenz, können Sie die 3. var in RegExMatch passieren die Gesamtübereinstimmung und von jedes gefangene Untermuster, wenn irgendwelche vorhanden sind.

So verwenden Sie ein viel einfacheres Muster:

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

Es wird die Position des Spiels zurück und speichert "Lublin" in SubPat[1].

Mit diesem Muster vermeiden Sie schwere Backtracking mit [\s\S]+<metryczka>GW\s(.+)\snr[\s\S]+ als erste [\s\S]+ bis zum Ende der Zeichenfolge, und dann zurück verfolgt, um für die nachfolgenden Untermuster aufzunehmen. Je länger die Zeichenfolge ist, desto langsamer ist die Operation.

+1

Perfekt! Wie immer. Ich hatte angefangen, meine Schnur abzuziehen, um sie kürzer zu machen (sie war anfangs ~ 80 kB) und du hast mir diese ausgezeichnete Lösung geliefert. Ich änderte meine ursprüngliche RegEx '[\ s \ S] + Gazeta \ s (. +) <\/dzial> [\ s \ S] +' zu ' Gazeta \ s (. +) <\/dzial>' und es funktioniert auch einwandfrei! – menteith