Regex match wat niet begint met...

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 09:54
Hoi mede Tweakers.

Ik zou graag alle "methodes" welke zonder "->" (met eventuele spaties/new lines) beginnen willen matchen.

Uit de volgende string:
code:
1
->method1(a, b)method2(c, d)  ->  method3(e, f, g) method4(h)

Wil ik het volgende resultaat:
code:
1
2
method2(c, d)
method4(h)

Nu ben ik zelf aan het testen met de volgende regex alleen matcht deze nu verkeerd. Ik probeerde een negative lookahead lookbehind uit te voeren alleen deze matcht enkel de eerste karakter na de "->".
code:
1
(?<!->)([a-z0-9]+)\(.*?\)

En wanneer ik een optionele \s wil toevoegen krijg ik een foutmelding "A quantifier inside a lookbehind makes it non-fixed width".
code:
1
(?<!->[\s]*)([a-z0-9]+)\(.*?\)

De eerste regex levert het volgende op:
code:
1
2
3
4
ethod1(c, d)
method2(c, d)
method3(e, f, g)
method4(h)

Niet het resultaat wat ik zoek helaas. Zou iemand mij een duw in de juiste richting willen geven? :)

Beste antwoord (via ZeroXT op 23-02-2020 14:13)


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
In dat geval kan je beter over parsers en lexers lezen dan over regexes.

Regexes zijn minder geschikt om meerdere niveaus (diepte) en modi (wel/niet binnen comments etc) bij te houden.

[ Voor 3% gewijzigd door Voutloos op 22-02-2020 19:29 . Reden: typos ]

{signature}

Alle reacties


Acties:
  • +2 Henk 'm!

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 26-09 12:50
Geen idee welke taal je dit voor schrijft (ja dit kan verschil maken), maar in de basis regex regels zit er sowieso al een fout in je code. Namelijk dat een negative lookahead is ?! en niet ?<!.
Verder kan ik je deze website aanraden voor het testen: regexr.com.

Oplossing voor je probleem tot nu toe:
code:
1
((->)\s*)([a-z0-9]+)\(.*?\)

Acties:
  • 0 Henk 'm!

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 09:54
Ik gebruikte een andere regex website:
https://regex101.com/

Negative lookbehind bedoelde ik in de startpost, is inmiddels aangepast.

Met de regex die je gaf, match ik alle methods met een "->" ervoor. Echter wil ik juiste alle methods matchen zonder een "->" ervoor :)

Acties:
  • +1 Henk 'm!

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 26-09 12:50
Hmm, ik zie zo geen oplossing hiervoor.
Ik denk trouwens dat je het onnodig ingewikkeld maakt voor jezelf. Waarom split je niet de string in losse stukken waarbij je telkens eindigt met ')'. Dan kun je daarna een regex of filter gebruiken om de stukken weg te laten waarin '->' voorkomt.

En voor welke programmeertaal je dit doet is op zich wel behulpzame informatie. Nogmaals niet elke regex functie is overal beschikbaar, of werkt zelfs op dezelfde manier.

Acties:
  • +2 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Of je vervangt met preg_replace alle stukken die je niet wil door een newline. Voila al je matches op een eigen regel. Daarna moet het wel lukken. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • DR!5EQ
  • Registratie: November 2009
  • Niet online
Postman schreef op zaterdag 22 februari 2020 @ 01:19:
Hmm, ik zie zo geen oplossing hiervoor.
Ik denk trouwens dat je het onnodig ingewikkeld maakt voor jezelf. Waarom split je niet de string in losse stukken waarbij je telkens eindigt met ')'. Dan kun je daarna een regex of filter gebruiken om de stukken weg te laten waarin '->' voorkomt.

En voor welke programmeertaal je dit doet is op zich wel behulpzame informatie. Nogmaals niet elke regex functie is overal beschikbaar, of werkt zelfs op dezelfde manier.
Hier ben ik het mee eens. Dit is dermate ingewikkeld dat je het niet met een simpele regex kunt oplossen. Het probleem is dat je in 1 regel opnieuw wilt kijken of "->" voorkomt. Regex doet dat niet standaard. Het zou inderdaad met capturing groups kunnen, maar dan moet wel iedere regel vrijwel hetzelfde zijn. Het zal helpen als je iets meer achtergrondinformatie en wat meer regels van de tekst waar je het op wilt loslaten kunt plaatsen.

Acties:
  • 0 Henk 'm!

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 09:54
Ben hobbymatig een template parser/engine aan het ontwikkelen die op PHP werkt. Deze zal variabelen en functies moeten kunnen parsen:

code:
1
2
3
{{ $item }}
{{ count([1, 2]) }}
{{ $item -> getId() }}

Het punt is dat de "user" ook eigen gedefinieerde functies kan aanroepen en deze niet dynamisch in de template aangeroepen kunnen worden. Dus ik had een oplossing om voor elke user defined functie "$this ->" voor te plakken zodat deze door de parser class afgevangen kan worden (__call).

code:
1
{{ $item -> getValute() . (count([1, 2]) + price(2, 5)) }}

Hier is price een user defined functie. Alleen wanneer een variabel is gedefinieerd die een methode heeft zoals {{ $item -> price() }}, dan mag price niet nogmaals omgezet worden naar "$item -> $this -> price()".

Side note: het is voornamelijk bedoeld voor variabelen te parsen en enkele functies. Dus niet zoals hierboven. Maar de parser moet er wel mee om kunnen gaan

Nu zat ik aan meerdere oplossingen te denken:
  • Regex (waar dit topic over gaat)
  • Alle functies extraheren en één voor één controleren of deze user defined is (maar dat gaat mis met methods van properties zoals in het voorbeeld hierboven)
  • Een try/catch eromheen en afvangen welke functie niet uitgevoerd kan worden en controleren of deze user defined is (maar hier ben ik geen fan van)
  • Een for loop die elke karakter parsed, forwards of backwards (dit is waar het waarschijnlijk heen gaat)
Side note: Als deze regex wel gaat werken komt er een volgend probleem namelijk dat de methods/functies tussen quotes en dubbele quotes niet geparsed hoeven worden.

[ Voor 5% gewijzigd door ZeroXT op 22-02-2020 09:48 ]


Acties:
  • Beste antwoord
  • +4 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
In dat geval kan je beter over parsers en lexers lezen dan over regexes.

Regexes zijn minder geschikt om meerdere niveaus (diepte) en modi (wel/niet binnen comments etc) bij te houden.

[ Voor 3% gewijzigd door Voutloos op 22-02-2020 19:29 . Reden: typos ]

{signature}


Acties:
  • 0 Henk 'm!

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 26-09 12:50
Heb je al gekeken naar de oplossing die Voutloos eerder aandroeg? (preg_match) Daar vang je ook je single en double quote probleem mee af (mits je daar weer een filter voor maakt).
Ik blijf erbij dat regex niet geschikt is, in ieder geval niet met het gebruik van een single line.

Acties:
  • +2 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:52
Met @Voutloos!

@ZeroXT over max. 1 jaar zien we je terug in een topic om te vragen hoe je het best X, Y kan doen in je recursive descent parser, omdat je er achter kwam dat je vastliep in je regex aanpak.

Ik zou je deze blog willen aanraden als handzame tutorial hoe je zo'n ding bouwt:
https://ruslanspivak.com/lsbasi-part9/

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
ZeroXT schreef op zaterdag 22 februari 2020 @ 09:33:
Ben hobbymatig een template parser/engine aan het ontwikkelen die op PHP werkt.
Kijk eens naar anderen zoals smarty, twig, phpbb, etc. Daar kan je van leren hoe je aan de slag kan gaan.

TAL is een ander concept gebaseerd op xml/html attributen.

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • fastedje
  • Registratie: Oktober 2016
  • Laatst online: 26-09 13:33
Vaak is voor complexen zoek en vervang acties een tool als awk/gawk beter geschikt Met sed kan je ook best wat doen als je complexe search/replace opsplitst in meerdere stappen.

Door middel van pipes kan je met gawk of sed meerdere kleine filter/replace stappen uitvoeren en ook stap voor stap testen.

Als je veel regels code moet aan passen dan is jet al snel interessant om zo'n search/replace te automatiseren.

Acties:
  • 0 Henk 'm!

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 09:54
CurlyMo schreef op zaterdag 22 februari 2020 @ 10:23:
Ik zou je deze blog willen aanraden als handzame tutorial hoe je zo'n ding bouwt:
https://ruslanspivak.com/lsbasi-part9/
Een erg nuttige link, dank!

En de rest ook bedankt, ik ga dit op een andere manier oplossen. :)

Acties:
  • +1 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:52
ZeroXT schreef op zondag 23 februari 2020 @ 11:55:
[...]


Een erg nuttige link, dank!
Alleen jammer dat je het niet als best antwoord selecteert. Niet om mij, maar wat je nu het beste antwoord labelt, doet me vermoeden dat je toch de neiging hebt de regex e.d. route te blijven volgen.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • +1 Henk 'm!

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 09:54
CurlyMo schreef op zondag 23 februari 2020 @ 12:55:
[...]

Alleen jammer dat je het niet als best antwoord selecteert. Niet om mij, maar wat je nu het beste antwoord labelt, doet me vermoeden dat je toch de neiging hebt de regex e.d. route te blijven volgen.
Ik ga niet aan de slag met regex hiervoor. Heb het beste antwoord aangepast naar de post van @Voutloos vanwege de eerste vermelding over parsers en lexers.
Pagina: 1