2017-02-25 2 views
3

Dies ist in Java 7Eine Zeichenfolge in Java aufteilen?

ich reguläre Ausdrücke weiß es nicht, so dass ich frage mich, ob jemand wusste, wie ich die Split-Methode verwenden, um alle Benutzernamen aus dem String zu erhalten:

{tchristofferson=10, mchristofferson=50} 

und dann füge die Benutzernamen einem String [] Array hinzu? Dies sind nur zwei Benutzernamen, aber ich möchte, dass dies für eine endlose Anzahl von Nutzernamen funktioniert.

Benutzername erfordern das folgende Format:

3-16 Zeichen, keine Räume, A-Z Groß- und Kleinschreibung und 0-9, nur spezielles Zeichen _ (Unterstrich).

+0

Was sind die gültigen Zeichen in einem Benutzernamen? Kann es Zahlen und Sonderzeichen wie _- und so weiter enthalten. –

+0

mit welcher Version von Java sollten Sie diese Aufgabe abschließen? – j2ko

+0

Ich mache dies in Java 7 – tchristofferson

Antwort

1

Das sieht nach JSON aus, also wäre die "richtige" Antwort vermutlich die Verwendung eines JSON-Parsers. Wenn dies nicht möglich ist, können Sie entfernen die umschließende {}, die Zeichenfolge aufgeteilt nach ", ", und spalteten dann jede Saite nach dem = Zeichen, das erste Element unter:

String input = "{tchristofferson=10, mchristofferson=50}"; 
List<String> users = 
    Arrays.stream(input.substring(1, input.length() - 1).split(", ")) 
      .map(s -> s.split("=")[0]) 
      .collect(Collectors.toList()); 
+1

Es ist kein gültiger JSON: JSON sollte Anführungszeichen um String-Werte haben (und streng genommen auch Schlüsselnamen). Die meisten Parser würden diese Eingabe ablehnen. – slim

+1

eigentlich sollte JSON Doppelpunkte anstelle von Gleichem haben – Jack

+0

[Muster # splitAsStream] (http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#splitAsStream-java.lang. CharSequence-) könnte prägnanter gewesen sein. – AJNeufeld

1

Hier ist der falsche (Job Sicherheit) Art und Weise:

String[] usernames = str.substring(1) 
         .split("=\\d+[,}]\\s*"); 

Warum ist das der falsche Weg? Wir werfen die Sachen raus, die wir nicht wollen. Das erste Zeichen (was auch immer es ist), und hoffen, dass "=#, " und "= #}" ist das einzige, was wir nicht wollen. Wenn die Zeichenfolge mit "{ tchristofferson=10" begann, würde der erste Benutzername ein Leerzeichen erhalten.

Der bessere Weg ist es, die Sachen, die Sie wollen, anzupassen. Und jetzt, wo ich versuche nicht, die Antwort auf einem iPhone-Bildschirm zu erstellen, hier ist es:

String input = "{tchristofferson=10, mchristofferson=50}"; 

    Pattern USERNAME_VALUE = Pattern.compile("(\\w+)=(\\d+)"); 
    Matcher matcher = USERNAME_VALUE.matcher(input); 

    ArrayList<String> list = new ArrayList<>(); 
    while(matcher.find()) { 
     list.add(matcher.group(1)); 
    } 
    String[] usernames = list.toArray(new String[0]); 

Dieser jedes Zeichen Ihrer Benutzername annimmt, entsprechen das \w Muster (dh [a-zA-Z0-9_] und andere alphanumerischen Unicode-Codepunkte) . Ändern Sie, wenn Ihre Benutzernamenanforderungen mehr oder weniger restriktiv sind.

(\w+) wird verwendet, um den Benutzernamen als matcher.group(1) zu erfassen, der zu der Liste hinzugefügt wird, die schließlich in Ihre String[] umgewandelt wird.

(\d+) wird auch verwendet, um die mit diesem Benutzer verknüpfte Nummer als zu erfassen. Diese Erfassungsgruppe wird (gegenwärtig) nicht verwendet, so dass Sie die Klammern für eine kleine Effizienzverstärkung, d. H. "(\\w+)=\\d+", entfernen könnten. Ich habe es aufgenommen, falls Sie etwas mit diesen Werten machen wollten.

0

Sie können Splitting versuchen, wenn es nicht (^) ist ein Wort (A-Za-z):

String[] tokens = test.split("[^A-Za-z]"); 

Und wenn keine Liste dagegen verwenden, versuchen Sie es wie @Mureinik mit vorgeschlagen:

List<String> tokens2 = Arrays.stream(test.split("[^A-Za-z]")) 
      .distinct() 
      .filter(w -> !w.isEmpty()) 
      .collect(Collectors.toList()); 

Edit1:

Wenn die Liste enthält Zahlen versuchen:

Zeichenfolge [] tokens = test.split ("[^ A-Za-z \ w]");

ich diese Seite sehr empfehlen, wenn Sie mit Regex experimentieren:

wie =

http://regexr.com/

+0

Wie könnte ich das tun, wenn der Benutzername Zahlen enthalten könnte? – tchristofferson

+0

'[^ A-Za-z \\ w]' ist gleichbedeutend mit '[^ \\ w]', was äquivalent zu '\ W' ist. Dies ergibt eine Ausgabe von "[tchristofferson", "10", "mchristofferson", "50"], wobei "", "10", "" und "" 50 "' sind keine Benutzernamen. – AJNeufeld

+0

Sie haben Recht. Ich werde das durchgehen. –

0

Wenn Benutzername enthält Zahlen und Sonderzeichen dann:

String str = "tchristofferson=10,mchristofferson=50";  
Pattern ptn = Pattern.compile(","); 
String[] usernames = ptn.split(str); 
Verwandte Themen