Java >> Java tutorial >  >> Tag >> String

Opdeling af en Java-streng med flere skilletegn

1. Introduktion

Vi ved alle, at det er en meget almindelig opgave at splitte en streng. Vi deler dog ofte med kun én afgrænsning.

I denne selvstudie vil vi diskutere i detaljer forskellige muligheder for at opdele en streng med flere afgrænsningstegn .

2. Opdeling af en Java-streng med flere skilletegn

For at vise, hvordan hver af løsningerne nedenfor udfører opdeling, bruger vi den samme eksempelstreng:

String example = "Mary;Thomas:Jane-Kate";
String[] expectedArray = new String[]{"Mary", "Thomas", "Jane", "Kate"};

2.1. Regex-løsning

Programmører bruger ofte forskellige regulære udtryk til at definere et søgemønster for strenge. De er også en meget populær løsning, når det kommer til at flække en streng. Så lad os se, hvordan vi kan bruge et regulært udtryk til at opdele en streng med flere skilletegn i Java.

For det første behøver vi ikke tilføje en ny afhængighed, da regulære udtryk er tilgængelige i java.util.regex pakke. Vi skal bare definere en inputstreng, vi vil dele, og et mønster.

Det næste trin er at anvende et mønster. Et mønster kan matche nul eller flere gange. For at opdele med forskellige afgrænsningstegn, skal vi bare indstille alle tegnene i mønsteret.

Vi skriver en simpel test for at demonstrere denne tilgang:

String[] names = example.split("[;:-]");
Assertions.assertEquals(4, names.length);
Assertions.assertArrayEquals(expectedArray, names);

Vi har defineret en teststreng med navne, der skal opdeles efter tegn i mønsteret. Selve mønsteret indeholder et semikolon, et kolon og en bindestreg. Når det anvendes på eksempelstrengen, får vi fire navne i arrayet.

2.2. Guava-løsning

Guava tilbyder også en løsning til at opdele en streng med flere skilletegn. Dens løsning er baseret på en Splitter  klasse. Denne klasse udtrækker understrengene fra en inputstreng ved hjælp af separatorsekvensen. Vi kan definere denne sekvens på flere måder:

  • som et enkelt tegn
  • en fast streng
  • et regulært udtryk
  • en CharMatcher forekomst

Længere fremme, Splitteren klasse har to metoder til at definere afgrænsningerne. Så lad os teste dem begge.

For det første tilføjer vi Guava-afhængigheden:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

Derefter starter vi med  metode:offentlig statisk splitter on(Pattern separatorPattern)

Det tager mønsteret til at definere afgrænsningerne for opdeling. Først vil vi definere kombinationen af ​​afgrænsningerne og kompilere mønsteret. Derefter kan vi dele strengen.

I vores eksempel bruger vi et regulært udtryk til at angive afgrænsningerne:

Iterable<String> names = Splitter.on(Pattern.compile("[;:-]")).split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

Den anden metode er onPattern metode:offentlig statisk splitter på mønster(strengseparatormønster)

Forskellen mellem denne og den tidligere metode er, at onPattern metoden tager mønsteret som en streng. Der er ingen grund til at kompilere det som i on metode. Vi definerer den samme kombination af afgrænsningerne til at teste onPattern metode:

Iterable<String> names = Splitter.onPattern("[;:-]").split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

I begge test lykkedes det os at opdele strengen og få arrayet med fire navne.

Da vi opdeler en inputstreng med flere skilletegn, kan vi også bruge anyOf metode i CharMatcher  klasse:

Iterable<String> names = Splitter.on(CharMatcher.anyOf(";:-")).split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

Denne mulighed leveres kun med til metode i Splitteren klasse. Resultatet er det samme som for de to foregående tests.

2.3. Apache Commons-løsning

Den sidste mulighed, vi vil diskutere, er tilgængelig i Apache Commons Lang 3-biblioteket.

Vi starter med at tilføje Apache Commons Lang-afhængigheden til vores pom.xml fil:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

Dernæst bruger vi opdelingen metode fra StringUtils klasse:

String[] names = StringUtils.split(example, ";:-");
Assertions.assertEquals(4, names.length);
Assertions.assertArrayEquals(expectedArray, names);

Vi skal kun definere alle de tegn, vi skal bruge til at opdele strengen. Ringer til split metoden opdeler eksemplet  streng ind i fire navne.

3. Konklusion

I denne artikel har vi set forskellige muligheder for at opdele en inputstreng med flere skilletegn. Først diskuterede vi en løsning baseret på regulære udtryk og almindelig Java. Senere viste vi forskellige muligheder tilgængelige i Guava. Til sidst afsluttede vi vores eksempler med en løsning baseret på Apache Commons Lang 3-biblioteket.

Som altid er koden til disse eksempler tilgængelig på GitHub.


Java tag