[RegEx] Replace meerdere nummers verschillende teksten

Pagina: 1
Acties:

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08 00:37
Ik vraag me af of het mogelijk is om bijvoorbeeld een nummer om te zetten naar een tekst.

Bijvoorbeeld

1 = customer
2 = employee
3 = other
etc.

Kan het uberhaupt met 1 regular expression replace?

Het gaat om een attribuut transformatie, ik krijg dus de waarde "1" binnen uit een tekstbestand en wil de waarde "customer" wegschrijven in een ander systeem.

Ik heb een regex gemaakt die matches kan maken:
([1])|([2])|([3])

Normaal geef je dan een replace text op voor de matches bijvoorbeeld "customer" maar dan veranderd die ook een 2 in "customer" en een 3 in "customer".

Mijn vraag is dus kan dit in 1 expressie? of heb je hier echt meerdere expressies voor nodig.

  • Sendy
  • Registratie: September 2001
  • Niet online
Vind je een switch statement niet leuk?

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 30-11 19:23
In php zou het kunnen met de 'e' modifier:
http://nl3.php.net/manual...cre.pattern.modifiers.php

Dus iets in de richting van: (Kan het nu niet testen)
PHP:
1
$string = preg_replace('/[0-9]/e','$array[\\1]',$string);


Voor array:
PHP:
1
$array = array(1 => 'customer', 2 => 'employee', 3 => 'other');

[ Voor 17% gewijzigd door EdwinG op 01-02-2007 14:57 . Reden: array voorbeeld toegevoegd ]

Bezoek eens een willekeurige pagina


  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08 00:37
Sendy schreef op donderdag 01 februari 2007 @ 14:43:
Vind je een switch statement niet leuk?
Die ken ik niet, kun je daar iets meer over vertellen, Regular Expressions zijn (nog) niet echt mijn ding.

  • Sendy
  • Registratie: September 2001
  • Niet online
?!? pak gewoon de handleiding er eens bij?

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08 00:37
Sendy schreef op donderdag 01 februari 2007 @ 14:57:
?!? pak gewoon de handleiding er eens bij?
Had ik ook gedaan, maar kon er weinig concreets over vinden, vandaar mijn vraag.

Maar er is dus wel een mogelijkheid begrijp ik uit jou reactie.

btw. ik gebruik JAVA, maar dacht dat Regular Expression over het algemeen hetzelfde geimplementeerd worden.

  • Sendy
  • Registratie: September 2001
  • Niet online
Maar waarom zou je dit met een regexp willen doen? Daarom mijn voorstel voor een switch statement.

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08 00:37
Ok dat was me dus niet duidelijk dat je een echt switch statement bedoeld.

De bedoeling is om niet te specifiek een transformatie te bouwen, daarom maken we gebruik van regexp om data te transformeren, nou zit ik met bovenstaand probleem en vroeg me af of dit toch op te lossen is met een regexp.

  • Sendy
  • Registratie: September 2001
  • Niet online
Dat snap ik niet. Leg die reden eens duidelijk uit? Je schrijft namelijk nu "we moeten data transformeren, maar zonder een specifieke transformatie te bouwen. Daarom wil ik een regexp gebruiken." Het woordje "specifiek" begrijp ik niet, en de redenatie om een regexp te gebruiken volg ik ook niet.

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08 00:37
Om het verhaal helemaal volledig te maken ik synchroniseer attributen vanuit een teksbestand naar een ADAM directory.

Om het een beetje dynamisch te maken configureer ik de te synchroniseren attributen in een configuratie bestand.

zoiets als:

<SyncAttribute source="attributeA" destination="attributeB" type="Advanced" RegularExpression="([1])|([2])|([3])" />

Dit betekend dus in mijn transformatie dat de regularexpression uitgevoerd wordt op de waarde van AttributeA, het resultaat wordt weggeschreven in AttributeB.

AttributeA komt vanuit een tekstbestand en AttributeB is een attribuut in ADAM.

Een switch is in mijn ogen dan te specifiek, want dat moet ik dan in code uitwerken (aangezien er geen mogelijkheid is via een RegExp), uiteraard kan ik via de configuratie ook een switch statement maken die uitgevoerd wordt in code, maar dat zie ik nog niet zitten.

Hopelijk maakt bovenstaand het een beetje duidelijker :)

  • Sendy
  • Registratie: September 2001
  • Niet online
Jaja, nu is het zeker duidelijk :)

Voordat ik ga vertellen waarom ik denk dat het niet kan zal ik eerst vertellen wat er nu gebeurd (en dat ik denk dat dat gek is (zonder meer te weten)) ;) Oh, ik weet niets van Java.

Jouw regexp "([1])|([2])|([3])" is bijzonder vreemd. Het volgende perl testprogrammaatje

code:
1
perl -e '$_="1"; /([1])|([2])|([3])/; print "x$1x$2x$3x";'


Retourneert x1xxx, xx2xx or xxx3x afhankelijk van de oorspronkelijk waarde. Je ziet dat er drie variabelen worden gevuld. Dat je hier dus 1 antwoord uit krijgt vind ik vreemd. Dit zal door code gedaan worden die de regexp afhandelt. (Ik zou de regexp vervangen door "([123])", dan wordt er maar 1 variabele gevuld en wel met dezelfde waarde als de oorspronkelijke waarde).

In een regexp kan je normaal geen nieuwe data genereren (alleen matchen en delen tekst uitvoeren). Zoals je ziet aan de link van EdwinG zijn er verschillende "modifiers". De "e" modifier doet blijkbaar een lookup naar een tabel. Nu, de code achter jouw regexp attribuut zou dat kunnen ondersteunen (maar doet dat zeer waarschijnlijk niet).

Ik zou dus een tabel-lookup attribuut maken.

Ik hoop dat het een beetje duidelijk is.

  • dominion99
  • Registratie: December 2001
  • Laatst online: 13-08 00:37
Sendy schreef op donderdag 01 februari 2007 @ 17:03:
.......

Ik hoop dat het een beetje duidelijk is.
Jou verhaal is ook duidelijk :) , wellicht is een tabel-lookup nog wel in een configuratie te passen.

Daar ga ik me even op concentreren, tevens ga ik kijken of de /e modifier van PHP ook bestaat in JAVA, daar had ik nog niet op gezocht.
Pagina: 1