Sublime Geplaatst: 5 januari 2012 Rapport Geplaatst: 5 januari 2012 (bewerkt) Beste GTAForum leden, Ik zit met een probleem, Ik gebruik java voor het matchen van diverse HTML onderdelen, maar het nadeel is bij het volgende dat is informatie moet hebben van een (optionele) group. (?sm)<div id=\"platform_requirements\" >.*?<p><b>Minimum: </b>(.*?)</p>.*?(?:<p><b>Aanbevolen: </b>(.*?)</p>)?.*?<div style=\"clear: both;\"></div>[\t\r\n]*</div> Dit patroon moet dus matchen met: <div id=\"platform_requirements\" > <p><b>Minimum: </b>Pentium 4</p> <p><b>Aanbevolen: </b>Intel core i7</p> <div style=\"clear: both;\"></div> </div> Maar ook met: <div id=\"platform_requirements\" > <p><b>Minimum: </b>Pentium 4</p> <div style=\"clear: both;\"></div> </div> Daarom staat dit stukje (wat in het onderste voorbeeld ontbreekt) regex een optioneel stuk: (?:<p><b>Aanbevolen: </b>(.*?)</p>)? Het goede is, is dat hij perfect matched in Java, maar ik krijg de group niet terug! (dit stukje dus: </b>(.*?)</p>). Als ik de parameters voor het optionele weghaal, dan werkt hij goed, en krijg ik ook gewoon resultaat terug in m.group(2). Bewerkt: 5 januari 2012 door Maikle Reageren
Hanneswasco Geplaatst: 5 januari 2012 Rapport Geplaatst: 5 januari 2012 Ik gebruik regexen bij het shell scripten, en dus niet in Java of iets dergelijks. Bij het shellscripten mag je, volgens mij, haakjes nooit nesten, wat je hier (?:<p><b>Aanbevolen: </b>(.*?)</p>) dus doet. Ik weet niet of het gaat werken maar je kan dus eens proberen om van de geneste haakjes drie verschillende niet-geneste groepen haakjes te maken. (?:<p><b>Aanbevolen: </b>)(.*?)(</p>) zo dus. Maar ik merk bijvoorbeeld op dat je het vraagteken op andere plaatsen zet dan waar ik het vraagteken normaal gebruik, dat ik verkeerd ben zou dus wel eens zeer goed kunnen. Reageren
Sublime Geplaatst: 5 januari 2012 Auteur Rapport Geplaatst: 5 januari 2012 Bedankt voor je snelle reactie Ik heb even getest zonder haakjes te nesten, wat mijn inderdaad ook vrij logisch klinkt, maar ik krijg het helaas niet aan het werk. Op deze manier: (?:<p><b>Aanbevolen: </b>)(.*?)(?:</p>) Zijn alle 3 de groepen niet optioneel (aangegeven door ? achter een groep), dus deze matched helaas niet als deze tags niet aanwezig zijn . Ik heb zelf ook geprobeerd de drie groepen optioneel te maken (en zelfs een poging om de match die ik wil niet optioneel te maken), maar deze werken helaas ook niet. (?:<p><b>Aanbevolen: </b>)?(.*?)?(?:</p>)? Met de ?: in het begin van de groep geef ik trouwens aan dat java dit niet in een String hoeft te zetten. Reageren
Hanneswasco Geplaatst: 5 januari 2012 Rapport Geplaatst: 5 januari 2012 Ahzo. Het vraagteken gebruik ik op dezelfde manier als jou, maar dat van Java te vertellen dat dit niet in een String hoeft gezet te worden wist ik niet. Maar volgens mij gebruik je het vraagteken dan op een verkeerde manier in het middelste deel: (.*?)?. .* matcht toch al alles, waarom dan nog eens een vraagteken erbij? Reageren
Sublime Geplaatst: 5 januari 2012 Auteur Rapport Geplaatst: 5 januari 2012 Ahzo. Het vraagteken gebruik ik op dezelfde manier als jou, maar dat van Java te vertellen dat dit niet in een String hoeft gezet te worden wist ik niet. Maar volgens mij gebruik je het vraagteken dan op een verkeerde manier in het middelste deel: (.*?)?. .* matcht toch al alles, waarom dan nog eens een vraagteken erbij? Een vraagteken heeft meerdere betekenissen, te zien aan de plek. .*? Betekent dat de Regex "Lazy" Moet matchen. Voorbeeldje: (.*)</div> In combinatie met deze string: blabla cool </div>meer coole verhalen</div> krijg je als resultaat: blabla cool </div>meer coole verhalen Maar als je aangeeft dat de Regex engine "Lazy" (dus zo kort mogelijk, ipv zo lang mogelijk wat standaard zo ingesteld is): blabla cool Maarja, je kan hem dus voor meerdere doeleinden gebruiken. Reageren
PatrickW Geplaatst: 5 januari 2012 Rapport Geplaatst: 5 januari 2012 Mmmh, vaag probleempje. het zou kunnen dat die binnenste grope niet aan een string wordt toegekend, omdat je dat met de buitenste groep hebt uitgezet. Probeer het eens zo: (?sm)<div id=\"platform_requirements\" >.*?<p><b>Minimum: </b>(.*?)</p>.*?(<p><b>Aanbevolen: </b>(.*?)</p>)?.*?<div style=\"clear: both;\"></div>[\t\r\n]*</div> Als het werkt, dan staat de string die je zoekt wel in group(3), vermoed ik. Een andere manier is om tee afzonderlijke regex-en te maken, om de twee waarden eruit te halen: (?sm)<div id=\"platform_requirements\" >.*?<p><b>Minimum: </b>(.*?)</p>.*?(?:<p><b>Aanbevolen: </b>.*?</p>)?.*?<div style=\"clear: both;\"></div>[\t\r\n]*</div> (?sm)<div id=\"platform_requirements\" >.*?<p><b>Aanbevolen: </b>(.*?)</p>.*?<div style=\"clear: both;\"></div>[\t\r\n]*</div> De eerste om de minimale waarde eruit te halen en dan een losse om de "aanbevolen" te pakken (of leeg, als hij niet bestaat) Reageren
Sublime Geplaatst: 5 januari 2012 Auteur Rapport Geplaatst: 5 januari 2012 Je eerste suggestie was ook één van de vele mogelijkheden die ik heb geprobeerd, helaas zonder resultaat. Het lijkt wel of het gewoonweg niet mogelijk is (in Java). Want als ik het patroon in RegExr test werkt deze gewoon goed. Als er geen oplossingen zijn moet ik het inderdaad maar opdelen in 2 Regex patronen. Helaas gaat me dit wel snelheidsverlies opleveren, omdat ik deze patronen zon 5000 keer achter elkaar nodig heb. Maar ja het moet maar . Hanneswasco en PatrickW, bedankt voor de moeite . Reageren
PatrickW Geplaatst: 5 januari 2012 Rapport Geplaatst: 5 januari 2012 Ik vraag me af of het werken met twee losse simpele expressies zoveel meer kost. Volgens mij is het matchen tegen een expressie met twee geneste optionele groepen niet echt heel goedkoop. Dus het werken met twee simpele expressies, zou niet eens zo heel veel duurder hoeven te zijn. Reageren
Sublime Geplaatst: 5 januari 2012 Auteur Rapport Geplaatst: 5 januari 2012 Ik vraag me af of het werken met twee losse simpele expressies zoveel meer kost. Volgens mij is het matchen tegen een expressie met twee geneste optionele groepen niet echt heel goedkoop. Dus het werken met twee simpele expressies, zou niet eens zo heel veel duurder hoeven te zijn. Oke, das mooi Ik denk dat ik ook maar meerdere threads ga gebruiken, dat zou het programma ook wel sneller maken . Reageren
PatrickW Geplaatst: 5 januari 2012 Rapport Geplaatst: 5 januari 2012 Ik denk dat ik ook maar meerdere threads ga gebruiken, dat zou het programma ook wel sneller maken . Zolang het aantal threads dat je maakt kleiner blijft dan het aantal cores dat je hebt, kan hij daar sneller van worden, inderdaad. Reageren
Recommended Posts
Een reactie plaatsen
Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.