Snijd strings uit het CSV-bestand in Java

Ik heb een tekstbestand met enkele tekenreeksen gescheiden door ",". Strings hebben de vorm van: "x: somestring: any string". Ik ben alleen geïnteresseerd in het extraheren van de 'somestring'-waarde. Ik kan "somestring: any string" extraheren door "x:" te vervangen door "" met:

Pattern p= Pattern.compile("x:", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("");

Maar zoals ik al eerder zei, ben ik alleen geïnteresseerd in 'somestring'. Is het mogelijk om een ​​tweede patroon toe te voegen om ": any string" te vervangen door "". Ik dacht erover hetzelfde proces opnieuw te herhalen, maar ik wilde vragen over een betere manier. Is er een manier om mijn reguliere expressie te verbeteren? Merk op dat "somestring" en "any string" geen vaste waarden zijn.

1

3 antwoord

Gebruik splitsen:

    for (String s : subjectString.split(",")) {
        s.split(":")[1];
    }
1
toegevoegd

Als je een string subjectString hebt die "x: somestring: any string" bevat, dan zal het volgende somestring extraheren:

Pattern regex = Pattern.compile(
    "(?<=x:) # Assert position right after 'x:'\n" +
    "[^:]*   # Match any number of characters except colons", 
    Pattern.COMMENTS);
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
    ResultString = regexMatcher.group();
} 
0
toegevoegd
Ik zou geen gebruik maken van regexes om een ​​CSV-bestand rechtstreeks te parseren. Dit zal zeker problemen veroorzaken (denk aan ingebedde nieuwe regels, gequote velden, enz.). Gebruik liever een CSV-bibliotheek om het bestand zelf af te handelen en pas vervolgens regexes toe op de velden die u hebt geparseerd.
toegevoegd de auteur Tim Pietzcker, de bron
je oplossingen werken prima. Maar dit betekent dat ik de strings in mijn bestand moet splitsen omdat het een CSV-bestand is. Behandel elke gesplitste reeks dan met behulp van uw code in een lus. Mijn bestand zal zooooo veel strings hebben. eventuele suggesties om mijn reeks van reeksen (string1, string2, string3, ..etc.) in een keer te behandelen zonder de noodzaak om elke tekenreeks te splitsen en afzonderlijk in een lus te behandelen?
toegevoegd de auteur Jury A, de bron

Een andere, eenvoudige manier is:

"x:somestring:any string".replaceAll (".*:(.*):.*", "$1")
0
toegevoegd
Wat is "$ 1" wordt gebruikt voor ??
toegevoegd de auteur Jury A, de bron
$ 1 is de eerste groep elementen, vastgelegd tussen ronde paren; hier is slechts één zo'n groep verklaard: het woord tussen de twee dubbele punten.
toegevoegd de auteur user unknown, de bron