Verwijder of vervang een deel van een string in Java

1. Overzicht

In deze tutorial gaan we kijken naar verschillende manieren waarop we een deel van een Draad in Java.

We onderzoeken het verwijderen en / of vervangen van een subtekenreeks met behulp van een Draad API en vervolgens een StringBuilder API en tenslotte met behulp van de StringUtils klasse van Apache Commons-bibliotheek.

Als bonus we zullen ook kijken naar het vervangen van een exact word met behulp van de String API en de Apache Commons RegExUtils klasse.

2. Draad API

Een van de eenvoudigste en eenvoudigste methoden om een ​​subtekenreeks te vervangen, is het gebruik van de vervangen, ReplaceAll of vervangenFirst van een String klasse.

De vervangen() methode heeft twee argumenten - doel en vervangende tekst:

String master = "Hallo wereld Baeldung!"; String target = "Baeldung"; String vervanging = "Java"; String verwerkt = master.replace (doel, vervanging); assertTrue (verwerkt. bevat (vervanging)); assertFalse (verwerkt. bevat (doel));

Het bovenstaande fragment levert deze uitvoer op:

Hallo wereld Java!

Als een reguliere expressie vereist is bij het kiezen van het doel, dan is de vervang alles() of replaceFirst () zou de voorkeursmethode moeten zijn. Zoals hun naam al aangeeft, vervang alles() zal elke overeenkomende instantie vervangen, terwijl de replaceFirst () vervangt de eerste overeenkomende instantie:

String master2 = "Welkom bij Baeldung, Hallo wereld Baeldung"; String regexTarget = "(Baeldung) $"; String verwerkt2 = master2.replaceAll (regexTarget, vervanging); assertTrue (verwerkt2.endsWith ("Java"));

De waarde van verwerkt 2 zal zijn:

Welkom bij Baeldung, Hallo wereld Java

Het is omdat de regex is geleverd als regexTarget komt alleen overeen met het laatste exemplaar van Baeldung. In alle bovenstaande voorbeelden kunnen we een lege vervanging gebruiken en het zal effectief een doelwit van een meester.

3. StringBuilder API

We kunnen ook tekst in Java manipuleren met de StringBuilder klasse. De twee methoden hier zijn verwijderen () en vervangen().

We kunnen een instantie van een StringBuilder van een bestaand Draad en gebruik vervolgens de genoemde methoden om het Draad manipulatie zoals gewenst:

String master = "Hallo wereld Baeldung!"; String target = "Baeldung"; String vervanging = "Java"; int startIndex = master.indexOf (doel); int stopIndex = startIndex + target.length (); StringBuilder builder = nieuwe StringBuilder (master);

Nu kunnen we het doelwit met de verwijderen ():

builder.delete (startIndex, stopIndex); assertFalse (builder.toString (). bevat (doel));

We kunnen net zo goed de vervangen() om de master bij te werken:

builder.replace (startIndex, stopIndex, vervanging); assertTrue (builder.toString (). bevat (vervanging));

Een duidelijk verschil tussen het gebruik van de StringBuilder en de Draad API is dat we de start- en stopindex van het doelwitDraad onszelf.

4. StringUtils Klasse

Een andere methode die we zullen overwegen, is de Apache Commons-bibliotheek.

Laten we eerst de vereiste afhankelijkheid aan ons project toevoegen:

 org.apache.commons commons-lang3 3.8.1 

De laatste versie van de bibliotheek is hier te vinden.

De StringUtils class heeft methoden voor het vervangen van een substring van een Draad:

String master = "Hallo wereld Baeldung!"; String target = "Baeldung"; String vervanging = "Java"; String verwerkt = StringUtils.replace (master, target, vervanging); assertTrue (verwerkt. bevat (vervanging));

Er is een overbelaste variant van de vervangen() waarvoor een geheel getal nodig is max. hoogte parameter, die het aantal keren bepaalt dat moet worden vervangen. We kunnen ook de replaceIgnoreCase () als hoofdlettergevoeligheid geen probleem is:

String master2 = "Hallo wereld Baeldung!"; String target2 = "baeldung"; String verwerkt2 = StringUtils.replaceIgnoreCase (master2, target2, vervanging); assertFalse (verwerkt2.bevat (doel));

5. Exacte woorden vervangen

In dit laatste voorbeeld we zullen leren hoe we een exact woord in een kunnen vervangen Draad.

De eenvoudige manier om deze vervanging uit te voeren, is door een reguliere expressie met woordgrenzen te gebruiken.

De reguliere expressie van het woord boundary is \ b. Als u het gewenste woord binnen deze reguliere expressie plaatst, komt alleen overeen met exacte exemplaren.

Laten we eerst eens kijken hoe we deze reguliere expressie kunnen gebruiken met de String API:

String zin = "Een auto is niet hetzelfde als een rijtuig, en sommige vliegtuigen kunnen auto's erin vervoeren!"; String regexTarget = "\ bcar \ b"; String exactWordReplaced = zin.replaceAll (regexTarget, "truck");

De exactWordVervangen string bevat:

"Een vrachtwagen is niet hetzelfde als een rijtuig, en sommige vliegtuigen kunnen auto's erin vervoeren!"

Alleen het exacte woord wordt vervangen. Let op: backward slash moet altijd worden ontsnapt bij het werken met reguliere expressies in Java.

Een alternatieve manier om deze vervanging uit te voeren, is door de RegExUtils class uit de Apache Commons Library, die als afhankelijkheid kan worden toegevoegd, zoals we in de vorige sectie hebben gezien:

String regexTarget = "\ bcar \ b"; String exactWordReplaced = RegExUtils.replaceAll (zin, regexTarget, "vrachtwagen"); 

Hoewel beide methoden hetzelfde resultaat zullen opleveren, hangt de beslissing welke moet worden gebruikt af van ons specifieke scenario.

6. Conclusie

Tot slot hebben we meer dan één manier onderzocht om een ​​substring in Java te verwijderen en te vervangen. De beste methode om toe te passen hangt nog grotendeels af van de huidige situatie en context.

Zoals gewoonlijk is de volledige broncode beschikbaar op Github.