[Java] Trash uit String halen

Pagina: 1
Acties:
  • 601 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 20740

Topicstarter
Stel ik heb een String die bestaat uit letters, cijfers, leestekens, enz.
Nu wil ik alle cijfers en leestekens e.d. uit die String halen, zodat alleen de letters over blijven.

Bijv.:

"lo34 l ," ---> "lol"
"A'dam mer k5aas" ---> "Adammer kaas"

Hoe doe ik dit handig in Java :?

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Dus je wilt spaties wel houden of niet :?

Anyway, maak een loopje over je string karakters en kijk steeds of dat karakter mag blijven. Of je doet het met een rexex natuurlijk *D

Acties:
  • 0 Henk 'm!

Anoniem: 20740

Topicstarter
Spaties moeten er ook uit...

Dat had ik ook al bedacht, maar dan moet ik alle karakters appart specificeren: dat moet toch mooier kunnen :?

Acties:
  • 0 Henk 'm!

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

de chars zitten in ascii ranges, maak overal een char van en vergelijk hem met de waarden die je wil toestaan..

(ff uitzoeken welke ascii waarden die hebben is een range van +- 70 tot 110)

Acties:
  • 0 Henk 'm!

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

dat kan ook mooier, immers alle letters (exclusief letters met trema en accenten enzo) in de ASCII tabel zitten tussen bepaalde waarden, dus je kunt gewoon kijken of de ASCII waarde van een bepaald teken ook tussen die waarden ligt. Zo ja, dan is het een letter!

Een uitgebreide ASCII tabel vindt je o.a. op:
http://web-wise-wizard.com/web-lookup-lists/ascii-ibm-extended-character-set.html

en dan zie je:
codes 65 t/m 90 = A t/m Z (hoofdletters)
codes 97 t/m 122 = a t/m z (kleine letters)
codes 128 t/m 154 = Ç t/m Ü (allerlei trema's en accenten)
codes 160 t/m 165 = á t/m Ñ (allerlei trema's en accenten)

(die laatste twee ranges kun je ook wel aan elkaar koppelen tot een grote check want de tussenliggende characters worden bijna niet gebruikt, engelse ponden en gulden teken etc.)

Hoe je dat moet checken? In Java weet ik het zo ff niet precies maar in pseudo code:
code:
1
2
3
4
5
6
7
8
String woord = ...

for (positie = 1; positie =< woord.length(); positie++)
{
  letter = woord.charAt(positie)   // mogelijk nog converten naar ASCII code? 
  if (letter < 65 || letter > 165 || (letter > 122 && letter < 128))
    // verwijder character, met een remove, mid/right/left functie ofzo
}

hmm dit gaat nog niet kloppen want als er een character weggehaald wordt dan slaat ie in feite een positie over (stel je haalt positie 2 weg, dan staat de positieteller op 3 in de volgende ronde maar het character van 3 is al naar 2 verschoven, dus die wordt niet meer gecheckt!)

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Euh... waarom expliciet met ASCII ranges gaan werken terwijl iets als dit er veel duidelijker uiziet?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static String format(String string) {

    int i, n = string.length();
    String temp = "";

    for (i=0; i<n; i++) {
        if (('a' <= string.charAt(i) && string.charAt(i) <= 'z')
            ||
            ('A' <= string.charAt(i) && string.charAt(i) <= 'Z'))
            temp = temp + string.charAt(i);
    }

    return temp;

}

[edit] In mijn editor stond het trouwens wel recht (:?), maar mooier en sneller is nog om de charAt() maar 1 keer te doen...

Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Je kan gewoon Character.isLetter(char) gebruiken om te kijken of iets een letter is.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Op donderdag 01 november 2001 12:41 schreef mbravenboer het volgende:
Je kan gewoon Character.isLetter(char) gebruiken om te kijken of iets een character is.
Zolang mbravenboer nog niet geantwoord heeft moet je er altijd rekening mee houden dat het wellicht nog makkelijker kan |:( :P

Acties:
  • 0 Henk 'm!

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Op donderdag 01 november 2001 12:41 schreef mbravenboer het volgende:
Je kan gewoon Character.isLetter(char) gebruiken om te kijken of iets een letter is.
da's helemaal toppie!!

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Acties:
  • 0 Henk 'm!

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Op donderdag 01 november 2001 12:40 schreef tomato het volgende:
Euh... waarom expliciet met ASCII ranges gaan werken terwijl iets als dit er veel duidelijker uiziet?
...
die's inderdaad ook mooier maar inderdaad die charAt() moet je ff 1 keer doen ;)

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
tomato: Zolang mbravenboer nog niet geantwoord heeft moet je er altijd rekening mee houden dat het wellicht nog makkelijker kan |:( :P
Hehe ;) . Ik houd gewoon niet van moeilijke dingen :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
mbravenboer: Hehe ;) . Ik houd gewoon niet van moeilijke dingen :) .
Moet je misschien toch eens naar PHP gaan kijken :P

Bestaat vast een functie
code:
1
string remove_trash_from_string(string string [, boolean remove_spaces])

:+

Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
tomato: Moet je misschien toch eens naar PHP gaan kijken :P
Dacht ut dus niet >:) .
Bestaat vast een functie remove_trash_from_string
Ik houd ook niet van niet generieke, niet configureerbare code die bepaalde aannamens maakt :) .

Een mooi Java(OO) oplossing: maak een methode filter die een CharacterFilter meekrijgt:
code:
1
2
3
4
5
6
7
8
9
public static String filter(String input, CharacterFilter filter)
{
    // ...
}

public interface CharacterFilter
{
    public boolean accept(char c)
}

en maak een TrashCharacterFilter of bijvoorbeeld een LetterCharacterFilter >:) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Kleine toevoeging: je kan nu zelfs filters samenstellen uit anders filters.

Neem bijvoorbeeld een LetterCharacterFilter en een DigitCharacterFilter. Maak een OrComposedCharacterFilter die twee filters mee krijgt... voila: alles wat letter of digit is blijft over :) .

Voor die lelijke boolean optie: Maak een SpaceCharacterFilter en een NotCharacterFilter die een CharacterFilter omdraait. ;) .

Goed... wat je al niet kan doen met characters ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 30-05 22:14
Java.... en dan hebben ze het over ASCII???

Damn, 't is nog altijd unicode.

Acties:
  • 0 Henk 'm!

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 10-03 22:20

MaxxRide

Surf's up

LOL, vooral het laatste is kewl

If you are not wiping out you are nog pushing enough...


Acties:
  • 0 Henk 'm!

Anoniem: 29485

Je kan ook een scanner schrijven in JLex
die op die karakters zoekt...
en dan via een parser het spul uitlezen en de uitvoer genereren .. ;)

hehe.. ;) maar dat is misshcien lastig

JLex manual:
http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manual.html
Pagina: 1