Jump to content

Regex patroon met optioneel stuk, en daarin een group.


Sublime

Recommended Posts

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: door Maikle
Link to comment
Delen op andere websites

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. :7

Link to comment
Delen op andere websites

Bedankt voor je snelle reactie :puh:

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.

Link to comment
Delen op andere websites

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?

Link to comment
Delen op andere websites

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.

Link to comment
Delen op andere websites

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)

Link to comment
Delen op andere websites

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 :tu: .

Link to comment
Delen op andere websites

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.

Link to comment
Delen op andere websites

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 :puh:

Ik denk dat ik ook maar meerdere threads ga gebruiken, dat zou het programma ook wel sneller maken :bier: .

Link to comment
Delen op andere websites

Ik denk dat ik ook maar meerdere threads ga gebruiken, dat zou het programma ook wel sneller maken :bier: .

Zolang het aantal threads dat je maakt kleiner blijft dan het aantal cores dat je hebt, kan hij daar sneller van worden, inderdaad. :bier:

Link to comment
Delen op andere websites

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.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...