Haal substring op van String in Java

1. Overzicht

In deze korte tutorial zullen we ons concentreren op de substring-functionaliteit van Strings in Java.

We gebruiken meestal de methoden van de Draad klasse en een paar van Apache Commons ' StringUtils klasse.

In alle volgende voorbeelden gaan we deze eenvoudige string gebruiken:

String text = "Julia Evans is geboren op 25-09-1984." + "Ze woont momenteel in de VS (Verenigde Staten van Amerika).";

2. Basisprincipes van deelstring

Laten we beginnen met een heel eenvoudig voorbeeld: een substring extraheren met de startindex:

assertEquals ("USA (Verenigde Staten van Amerika).", text.substring (67));

Merk op hoe we het land van verblijf van Julia hier in ons voorbeeld hebben geëxtraheerd.

Er is ook een optie om een ​​eindindex op te geven, maar zonder - deelstring gaat helemaal naar het einde van de Draad.

Laten we dat doen en die extra punt aan het einde verwijderen, in het bovenstaande voorbeeld:

assertEquals ("USA (Verenigde Staten van Amerika)", text.substring (67, text.length () - 1));

In de bovenstaande voorbeelden hebben we de exacte positie gebruikt om de subtekenreeks te extraheren.

2.1. Een substring krijgen die begint bij een specifiek personage

In het geval dat de positie dynamisch moet worden berekend op basis van een teken of Draad we kunnen gebruik maken van de index van methode:

assertEquals ("Verenigde Staten van Amerika", text.substring (text.indexOf ('(') + 1, text.indexOf (')')));

Een vergelijkbare methode die ons kan helpen bij het vinden van onze substring is lastIndexOf. Laten we gebruiken lastIndexOf om het jaar “1984” eruit te halen. Het is het tekstgedeelte tussen het laatste streepje en de eerste punt:

assertEquals ("1984", text.substring (text.lastIndexOf ('-') + 1, text.indexOf ('.'))));

Beide index van en lastIndexOf kan een teken of een Draad als parameter. Laten we de tekst "VS" en de rest van de tekst tussen haakjes extraheren:

assertEquals ("USA (Verenigde Staten van Amerika)", text.substring (text.indexOf ("USA"), text.indexOf (')') + 1));

3. Met behulp van subSequence

De Draad class biedt een andere methode genaamd subSequence die werkt vergelijkbaar met de deelstring methode.

Het enige verschil is dat het een CharSequence inplaats van een Draad en het kan alleen worden gebruikt met een specifieke begin- en eindindex:

assertEquals ("USA (Verenigde Staten van Amerika)", text.subSequence (67, text.length () - 1));

4. Reguliere expressies gebruiken

Reguliere uitdrukkingen zullen ons te hulp schieten als we een subtekenreeks moeten extraheren die overeenkomt met een specifiek patroon.

In het voorbeeld Draad, Julia's geboortedatum heeft de notatie "dd-mm-jjjj". We kunnen dit patroon matchen met behulp van de Java reguliere expressie API.

Allereerst moeten we een patroon maken voor "dd-mm-jjjj":

Pattern pattern = Pattern.compile ("\ d {2} - \ d {2} - \ d {4}");

Vervolgens passen we het patroon toe om een ​​overeenkomst uit de gegeven tekst te vinden:

Matcher matcher = patroon.matcher (tekst);

Bij een succesvolle match kunnen we de match extraheren Draad:

if (matcher.find ()) {Assert.assertEquals ("25-09-1984", matcher.group ()); }

Bekijk deze tutorial voor meer informatie over de reguliere Java-expressies.

5. Met behulp van splitsen

We kunnen de splitsen methode van de Draad class om een ​​subtekenreeks te extraheren. Stel dat we de eerste zin uit het voorbeeld willen halen Draad. Dit is vrij eenvoudig te doen met splitsen:

String [] zinnen = text.split ("\.");

Omdat de split-methode een regex accepteert, moesten we ontsnappen aan het punt-teken. Het resultaat is nu een reeks van 2 zinnen.

We kunnen de eerste zin gebruiken (of de hele array doorlopen):

assertEquals ("Julia Evans werd geboren op 25-09-1984", zinnen [0]);

Houd er rekening mee dat er betere manieren zijn voor zinsdetectie en tokenisatie met Apache OpenNLP. Bekijk deze tutorial voor meer informatie over de OpenNLP API.

6. Met behulp van Scanner

We gebruiken over het algemeen Scanner om primitieve typen te ontleden en Snaren met behulp van reguliere expressies. EEN Scanner breekt zijn invoer in tokens met behulp van een scheidingstekenpatroon, die standaard overeenkomt met witruimte.

Laten we kijken hoe we dit kunnen gebruiken om de eerste zin uit de voorbeeldtekst te halen:

probeer (Scanner scanner = nieuwe scanner (tekst)) {scanner.useDelimiter ("\."); assertEquals ("Julia Evans werd geboren op 25-09-1984", scanner.next ()); }

In het bovenstaande voorbeeld hebben we het voorbeeld gegeven Draad als bron voor de scanner om te gebruiken.

Vervolgens stellen we het punt-teken in als het scheidingsteken (dat moet worden geëscaped, anders wordt het in deze context behandeld als het speciale reguliere-expressieteken).

Ten slotte bevestigen we het eerste token van deze gescheiden uitvoer.

Indien nodig kunnen we de volledige verzameling tokens doorlopen met behulp van een terwijl lus.

while (scanner.hasNext ()) {// doe iets met de tokens die worden geretourneerd door scanner.next ()}

7. Maven Afhankelijkheden

We kunnen een beetje verder gaan en een handig hulpprogramma gebruiken - het StringUtils class - onderdeel van de Apache Commons Lang-bibliotheek:

 org.apache.commons commons-lang3 3.8 

De laatste versie van deze bibliotheek vind je hier.

8. Met behulp van StringUtils

De Apache Commons-bibliotheken voegen een aantal handige methoden toe voor het manipuleren van Java-kerntypen. Apache Commons Lang biedt een groot aantal helperhulpprogramma's voor de java.lang API, met name Draad manipulatiemethoden.

In dit voorbeeld gaan we zien hoe een substring genest tussen twee te extraheren Snaren:

assertEquals ("Verenigde Staten van Amerika", StringUtils.substringBetween (text, "(", ")"));

Er is een vereenvoudigde versie van deze methode voor het geval de subtekenreeks tussen twee exemplaren van dezelfde is genest Draad:

substringBetween (String str, String-tag)

De substringAfter methode uit dezelfde klasse krijgt de subtekenreeks na het eerste voorkomen van een scheidingsteken.

Het scheidingsteken wordt niet geretourneerd:

assertEquals ("de VS (Verenigde Staten van Amerika).", StringUtils.substringAfter (tekst, "living in"));

Evenzo is het substringBefore methode haalt de substring op voordat een scheidingsteken voor het eerst voorkomt.

Het scheidingsteken wordt niet geretourneerd:

assertEquals ("Julia Evans", StringUtils.substringBefore (text, "was geboren"));

Je kunt deze tutorial bekijken om er meer over te weten te komen Draad verwerking met behulp van Apache Commons Lang API.

9. Conclusie

In dit korte artikel hebben we verschillende manieren ontdekt om een ​​subtekenreeks uit een Draad in Java. U kunt onze andere tutorials bekijken op Draad manipulatie in Java.

Zoals altijd zijn codefragmenten te vinden op GitHub.