Toon posts:

[C#] String - Tokens splitsen op niet [a-z] of -[0-9] of ???

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ben bezig met een tokenizer en heb een boel RTF tokens :P

Voor degene die eerder posts van mij hebben gezien hierover, vergeet dat. Eén groot drama :*)

Anyway... back to business!

Ik heb dus RTF tags zoals \rtf1\ansi\ansicpg1252\uc1\deff0 ... \fi-360\li720 ... en nog een boel meer. Duizenden voor een simpele RTF.

Heb alles netjes in tokens en kan dus door een stack heen stappen. Op dit moment heb ik alleen een Token naam, wat bijvoorbeeld \rtf1 \ansi of \ansicpg1252 is, dus compleet met numerieke waarde (positief/negatief).

De numerieke waarde wil ik eraf halen en in een separate variabele bewaren voor dat token.

Er zijn een aantal manieren waarop ik dit kan doen...

1) Een regex om twee matches te krijgen. Deel 1 bevat dan \[a-z] en deel twee -[0-9]
2) Een string[X] controleren of het een letter is > tot niet letter
3) Een string[X] controleren of het een getal of - teken is > en dat onthouden

Aangezien het om duizenden tokens gaat vraag ik wat jullie denken dat slim is om te doen, of welke andere manieren er mogelijk zijn. Sta voor een boel open :)

Alvast bedankt!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik zou denk zoiets doen
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
int number = 0, factor = 1;
string token = GetToken();
for(int i=token.Length-1; i >= 0 ; i++){
    char currChar = token[i];
    if(!currChar.IsNumber()){
        if(currChar == '-'){
            number = -number;
        }
        break;
    }    
    number += (int)(currChar-'0') * factor;
    factor *= 10;
}

Aangezien het om eenvoudige patronen gaat zou ik geen regular expressions gebruiken.

[ Voor 9% gewijzigd door Woy op 04-07-2007 14:07 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Bovenstaand algoritme ligt zo op z'n gat, denk alleen al aan wat willekeurige mintekens. Ik neem aan dat het een voorbeeld is.

Waarom geen regular expressions? Overzichtelijker, schaalbaarder en makkelijker.

  • Marcj
  • Registratie: November 2000
  • Laatst online: 01-12 16:59
Zijn de tokens gegarandeerd altijd in de vorm: \\[a-z]*-?[0-9]* ? Je zou hiervoor een regular expression kunnen gebruiken, maar als je wat meer snelheid nodig bent kun je hiervoor ook vrij eenvoudig een functie schrijven. Daarnaast moet je ook wel onthouden dat je met een eigen functie wat makkelijker controlles kunt toevoegen als de token niet helemaal volgens de standaardvorm gaat...