Avatar billede elprebsi Praktikant
19. juli 2013 - 15:05 Der er 8 kommentarer og
1 løsning

Unicode udrensning af java String

Hej Eksperter.

Jeg skal lave en lille rutine, som renser en java String, så jeg kun har nedenstående Unicode klasser tilbage i den. Kan I hjælpe mig på vej til, hvordan jeg gør?

- Bogstaver (L - All Letters)
- Ikke-luftige accenter (Mn Marks - nonspacing)
- Arabertal (0-9)
- Bogstaver (P - All Punctuation)
- Symbols (S - All Symbols)

Sommerhilsner
El Prebsi
Avatar billede arne_v Ekspert
19. juli 2013 - 15:17 #1
dinstring.replace("[^A-Za-z0-9,.]", "")

tilfoej selv alle de tegn du vil beholde
Avatar billede elprebsi Praktikant
19. juli 2013 - 15:34 #2
Hej Arne.

Tak for svaret.

Jeg havde håbet, at jeg ikke explicit skulle sidde og udvælge eéëè osv., men kunne kalde en eller anden

if (UnicodeHelper.isCharacterUnicodeClassL(minkarater))
{
  ...
}

Som jeg læser mig frem til (http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters#General_Category), så findes den kategorisering af Unicode karaktererne, som jeg refererer til.

Jeg havde blot håbet på at Java havde én eller anden sindrig implementering af denne kategorisering, så jeg slap for håndarbejdet.

Det ville også gøre min kode mere robust, hvis kategorierne udvikler sig over tid.

/El Prebsi
Avatar billede arne_v Ekspert
19. juli 2013 - 15:44 #3
Du burde kunne konstrueree strengen med hjaelp af Character.UnicodeBlock's hvis du vil.
Avatar billede arne_v Ekspert
19. juli 2013 - 16:28 #4
Ups. Det er vist general category ikke blocks du vil have. men det kan ogsaa laves. Jeg proever at bixe et eksempel.
Avatar billede arne_v Ekspert
19. juli 2013 - 16:41 #5
Noget a la:

import java.util.regex.Pattern;

public class Strip {
    private static byte[] validCategories = { Character.UPPERCASE_LETTER, Character.LOWERCASE_LETTER, Character.DECIMAL_DIGIT_NUMBER };
    private static Pattern valid;
    static {
        StringBuilder sb = new StringBuilder();
        for(int c = 0; c <= 0x0000FFFF; c++) {
            for(byte cat : validCategories) {
                if(Character.getType(c) == cat) {
                    sb.append((char)c);
                }
            }
        }
        valid = Pattern.compile("[^" + Pattern.quote(sb.toString()) + "]");
    }
    public static String strip(String s) {
        return valid.matcher(s).replaceAll("");
    }
    public static void main(String[] args) {
        System.out.println(Strip.strip("a b c"));
        System.out.println(Strip.strip("123.456"));
        System.out.println(Strip.strip("æøå"));
    }
}
Avatar billede elprebsi Praktikant
19. juli 2013 - 17:20 #6
Tak for det. Det kan jeg sagtens bytte videre på.

Kan du sige mig, om String's både kan indeholde char's og Unicode karakterer ?

Smid et svar.

Tak for hjælpen
El Prebsi
Avatar billede arne_v Ekspert
19. juli 2013 - 17:32 #7
String indeholder altid char's. Og char's er naesten det samme som Unicode codepoints. Forskellen er at der gaar 2 chars paa codepoints > 0xFFFF.
Avatar billede arne_v Ekspert
19. juli 2013 - 17:35 #8
og svar
Avatar billede arne_v Ekspert
19. juli 2013 - 17:37 #9
Character og String klasserne har metoder for aegte codepoint haandtering. Men hvis du kan noejes me 0-0xFFFF, saa er det altsaa nemmere.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester