[Perl regexp] omgekeerd zoeken

Pagina: 1
Acties:

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Hallo,

ik heb een regexp en daarmee wil ik van rechts naar links zoeken. Welke modifier moet ik daarvoor gebruiken? In mijn boek staat niets, en op Internet kan ik niets anders vinden dan "er wordt altijd van links naar rechts gezocht, tenzij anders aangegeven". Zou ik graag weten hoe je dat aangeeft dan. Dank u :D

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11:02
Misschien kun je hier iets mee:

http://www.crusoe.net/~jeffp/sexeger/

Het geeft in ieder geval meer informatie over je probleem.

Op de Perl website wordt trouwens gezegd dat het gebruik van reverse niet zoveel performance-verlies oplevert, aangezien reverse erg efficient is in vergelijking met de regex-engine in 't algemeen en de meeste regexes die gebouwd worden in 't bijzonder.

(Misschien ten overvloede: een modifier die dat doet, bestaat dus (nog) niet.)

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
* muba juigt!

Danku! Hrrmz wel stom dat op die websites stond dat het dus wel zou kunnen met regexp dingen, maar dat het uiteindelijk dus moet met normale Perl commando's.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • tomato
  • Registratie: November 1999
  • Niet online
Inderdaad, sexeger heb ik nog krom om gelegen :D

Maar wat wil je precies doen dat je niet met een 'gewone' regex kunt bereiken en ook niet met een simpele 'reverse'?

[edit]
Zocht dus toch gewoon naar 'reverse' :)

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
'K wou n getal ombouwen naar iets duidelijk leesbaars:

1452367 wordt 1.452.367

Mijn regexp: s/(\d{3})/$1,/g

Leverde op: 145.236.7
Ik wist van te voren ook wel dat het dit zou gaan opleveren, daarom zocht ik ook die modifier om het van rechts naar links te doen... maar met 2 maal reversen kom je er ook.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • tomato
  • Registratie: November 1999
  • Niet online
s/(\d{3})(?=(?:\d{3})+$)/$1,/g

ofzo zou ik dan eerder doen. Maar liever nog gewoon een number formatting functie :)

  • tomato
  • Registratie: November 1999
  • Niet online
Ik keek nog even en na een kleine aanpassing kom ik op deze:

s/(\d+?)(?=(?:\d{3})+$)/$1,/g

Maar ik moet toegeven dat dat er niet echt mooi uitziet. Ik zou je toch een number formatting functie aan willen raden ;)

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Topicstarter
Waarom die $ in je regexp? Dat is einde-string, maar dat hoeft er niet per se te staan. Wat voor number-formatting functies zijn er zoal dan?

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • tomato
  • Registratie: November 1999
  • Niet online
MUBA: Waarom die $ in je regexp? Dat is einde-string, maar dat hoeft er niet per se te staan.
Hij is wel noodzakelijk voor de goede werking van regex, de setjes drietallen moeten immers raken aan de achterkant van de string (als daar 1 of 2 cijfers tussen kunnen zitten heeft het hele idee van drietallen geen zin).
Je hebt gelijk als het gaat om niet-gehele getallen, dan zou je naar een decimaalteken moeten kijken ipv naar een eol-anchor.

Je zou dan zoiets kunnen krijgen (punten tussen duizendtallen en komma als decimaalteken):
code:
1
s/(\d+?)(?=(?:\d{3})+(?:$|,))/$1./g
Wat voor number-formatting functies zijn er zoal dan?
Volgens mij voldoet printf() of sprintf() hier al ;)
Pagina: 1