Reguliere expressie gevraagd met STX/ETX regeleinde

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • SURFivor
  • Registratie: Maart 2004
  • Niet online
Ik ben een reguliere expressie aan het schrijven om een discussiesysteem uit te lezen en postnummers te herkennen. Het systeem stuurt code uit maar deze code bevat geen carriage return of linefeed. Wel bevat het STX en ETX. Ik probeer een reguliere expressie te maken die deze regeleindes kan herkennen maar ik kom er niet helemaal uit.

Wat ik heb geprobeerd: http://regexr.com/3cltn

Kan ik voor elkaar krijgen wat ik wil? En hoe krijg ik dit dan voor elkaar?

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt ASCII codes gebruiken in een regex: \x02 (STX) en \x03 (ETX) zou moeten werken. Ik zie in je probeersel helaas geen text waarin die codes voorkomen of waarop die regex z'n werk zou moeten doen volgens mij dus dat is een beetje lastig testen.

[ Voor 64% gewijzigd door RobIII op 27-01-2016 11:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • SURFivor
  • Registratie: Maart 2004
  • Niet online
een export in kladblok resulteert in haakjes, zie https://www.dropbox.com/s/gfdkp8p8c6zdfvf/image008.png?dl=0

De uitleg van de leverancier is:
Tussen twee commando’s in deze API maken we gebruik van een STX en ETX (sommige ascii editors maken hier ‘blokhaken’ van). Een carriage return is overbodig en enkel overhead.
De punten in de link verwijzen wel naar STX en ETX. Kan ik iets aan de leverancier vragen wat zou kunnen helpen dit probleem op te lossen?

Acties:
  • 0 Henk 'm!

  • SURFivor
  • Registratie: Maart 2004
  • Niet online
@RobIII jouw codes werken wel in de expressietester. Nu is het alleen nog zaak aan te geven het begin en eind van een regel. Dit kan met ^ en $ maar dan wordt de code niet gepakt.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Het is me nog steeds niet heel erg duidelijk (en een (erg karige by the way) screenshot helpt daar niet bepaald in). Kun je niet een stukje voorbeeld (ontdaan van evt. data die je niet online wil hebben / aangepast zodat er "foo" en "bar" op die plekken) plaatsen?

Een andere oplossing/riching is: voordat je de regex op de string los laat alle STX/ETX vervangen door \r\n of iets dergelijks en dan pas de regex die je nu voor ogen hebt uitvoeren waarbij je je niet meer druk hoeft te maken over die STX/ETX.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • SURFivor
  • Registratie: Maart 2004
  • Niet online
Hi RobIII, dank voor je reactie.

Ik ben sinds gisteren bezig met dit soort dingen dus voor mij is het lastig te begrijpen wat je precies bedoelt. Maar ik zal een poging wagen.

Ik krijg uit een systeem de volgende codes

01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>01:evt0002010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">0</par></evt>01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>01:evt0002010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">0</par></evt>

Tussen de regels door zit STX en ETX alleen kan ik deze tekens niet copy-pasten (geen idee waarom niet?). Het screenshotje laat zien dat daar die haken staan. Wij hebben geen invloed op deze data, dit is een gegeven en hier moeten wij mee dealen. Dus de STX en ETX kunnen niet aangepast worden naar iets anders. Als dat je vraag is tenminste.

Als je de informatie filtert, onderscheid ik twee commando's. Een aan- en uit-commando

AAN
01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>

FOO<par nam="id">0009</par>FOOBAR<par nam="mst">1</par>BAR

UIT
01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">0</par></evt>

FOO<par nam="mst">0</par>BAR

Wij gebruiken een reguliere expressie om de par nam id te herkennen uit een string. Ons systeem heeft normaal een CR of LF nodig om te herkennen waar een regeleinde zit maar in dit geval wijkt het af van wat wij normaal gesproken doen. Mijn opdracht is om hier omheen te werken, dat wij deze CR of LF niet nodig hebben.

Hopelijk schept dit wat duidelijkheid?

[ Voor 5% gewijzigd door SURFivor op 27-01-2016 13:34 ]


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
SURFivor schreef op woensdag 27 januari 2016 @ 13:30:
Het screenshotje laat zien dat daar die haken staan. Wij hebben geen invloed op deze data, dit is een gegeven en hier moeten wij mee dealen. Dus de STX en ETX kunnen niet aangepast worden naar iets anders. Als dat je vraag is tenminste.
Hoezo heb je geen invloed op die data? Als je er een regex overheen kan gooien dan kan je er toch ook eerst een copie van maken en daarop een stringreplace functie uitvoeren?

Acties:
  • 0 Henk 'm!

  • SURFivor
  • Registratie: Maart 2004
  • Niet online
Gomez12, ik begrijp niet wat je bedoelt

Wij communiceren met een apparaat via TCP/IP. Dit apparaat geeft ons deze codes. Als ik in een terminal-lezer deze data uit lees en weg schrijf in kladblok en dit kladblok-bestand open, dan zie ik daar van die haken staan. Als ik deze informatie copy-paste, dan verdwijnen deze blokhaken. Volgens de leverancier zijn dit STX en ETX commando's:
Tussen twee commando’s in deze API maken we gebruik van een STX en ETX (sommige ascii editors maken hier ‘blokhaken’ van). Een carriage return is overbodig en enkel overhead.
Ons systeem kan de data niet goed interpreteren omdat wij STX en ETX niet herkennen als regelbegin of -einde. Mijn vraag is, kan ik dit omzeilen door in de regex een begin en eind te markeren zodat ik deze CR of LF kan omzeilen?

Ik heb nu het volgende: http://regexr.com/3clvg dit lijkt wel een soort van te werken alleen begrijp ik niet waarom deze expressie een heel blok tekst pakt? Ik wil gewoon dat hij start vanaf de STX en eindigt bij de ETX. Is dit mogelijk?

[ Voor 12% gewijzigd door SURFivor op 27-01-2016 13:52 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
SURFivor schreef op woensdag 27 januari 2016 @ 13:50:
Ik heb nu het volgende: http://regexr.com/3clvg dit lijkt wel een soort van te werken alleen begrijp ik niet waarom deze expressie een heel blok tekst pakt? Ik wil gewoon dat hij start vanaf de STX en eindigt bij de ETX. Is dit mogelijk?
Je hebt een string blablabla<stx>blablabla<etx>blablabla (boeie waar die vandaan komt). Voordat je die regex er op los laat kun je die string toch gewoon door een replace functie heen halen?

mystring = replace(replace(mystring, "<stx>", "\r\n"), "<etx>, "\r\n");

Verder zou ik proberen de string "uit elkaar te pluizen" totdat je valid XML elementen hebt (want 't is dus nogal een rommel van tekst en XML door elkaar :X ) en dan een XML parser gebruiken om de waardes uit de nodes te plukken die je wil hebben. Een regex gebruiken voor XML leidt, in the long run, gegarandeerd tot tranen. M.a.w. je wil dus dit bereiken:

Bron (c.q. van leverancier):
code:
1
01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>01:evt0002010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">0</par></evt>01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>01:evt0002010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">0</par></evt>


Uitsplitsen naar regel / array (o.i.d.) element per event:
code:
1
2
3
4
5
01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>
01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>
01:evt0002010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">0</par></evt>
01:evt0001010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>
01:evt0002010:<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">0</par></evt>

Dat zou je kunnen bereiken door de data te splitten (soms ook wel "exploden" genoemd) op de STX/ETX chars.

Daarna "ontdoen" van non-XML data:
code:
1
2
3
4
5
<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>
<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>
<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">0</par></evt>
<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">1</par></evt>
<evt nam="evt_mst"><par nam="id">0009</par><par nam="sta">1</par><par nam="mst">0</par></evt>

(Hoewel je mogelijk wel de data die je hier "weghaalt" nog wil associëren met elke regel/element?)

Vervolgens een XML parser gebruiken op elke regel / element om de node met een id attribute te vinden en diens value (0009 in bovenstaande gevallen) eruit te halen o.i.d.
SURFivor schreef op woensdag 27 januari 2016 @ 13:50:
Ik heb nu het volgende: http://regexr.com/3clvg dit lijkt wel een soort van te werken alleen begrijp ik niet waarom deze expressie een heel blok tekst pakt? Ik wil gewoon dat hij start vanaf de STX en eindigt bij de ETX. Is dit mogelijk?
Wederom ontbreekt daar de text die we nodig hebben (inc. stx/etx codes). Hier hebben we bar weinig aan.
SURFivor schreef op woensdag 27 januari 2016 @ 13:50:
Als ik in een terminal-lezer deze data uit lees en weg schrijf in kladblok en dit kladblok-bestand open, dan zie ik daar van die haken staan. Als ik deze informatie copy-paste, dan verdwijnen deze blokhaken.
Dat is omdat "jouw notepad" (geen idee welke je gebruikt; standaard windows notepad?) besluit om STX/ETX weer te geven als een-of-ander haakje. Maar STX/ETX zijn zgn. non-printable codes (sterker: het zijn control codes). Hoe (en of) een editor (notepad of eender welke andere editor) besluit weer te geven staat los van 't feit of ze wel-of-niet mee gecopy/paste worden of zichtbaar zijn in een andere editor. For all you know laat mijn editor van keus ze zien als » en «.

[edit]
En hoewel ik ferm geloof in
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
vrees ik dat ik (en anderen) nog steeds niet helemaal op 1 lijn zitten met jou dus heb ik 't even uitgewerkt in C# en zoals je zult zien komt hier geen regex aan te pas: https://dotnetfiddle.net/wM8eAk. Laten we het erop houden dat ik hoop dat ik je nu geen vis heb gegeven maar een joekel van een duw in de juiste richting.

[ Voor 97% gewijzigd door RobIII op 27-01-2016 21:47 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1