Verwijder voor- en achterliggende tekens uit een tekenreeks

1. Inleiding

In deze korte tutorial zullen we verschillende manieren zien om voorloop- en volglettertekens te verwijderen uit een Draad. Eenvoudigheidshalve zullen we nullen in de voorbeelden verwijderen.

Bij elke implementatie maken we twee methoden: een voor voorloop en een voor achterliggende nullen.

Dit probleem heeft een randgeval: wat willen we doen als de invoer alleen nullen bevat? Retourneer een leeg Draad, of een Draad met een enkele nul? In elk van de oplossingen zien we implementaties voor beide gebruiksscenario's.

We hebben eenheidstests voor elke implementatie, die u kunt vinden op GitHub.

2. Met behulp van StringBuilder

In onze eerste oplossing maken we een StringBuilder met het origineel Draad, en we zullen de onnodige tekens verwijderen vanaf het begin of het einde:

String removeLeadingZeroes (String s) {StringBuilder sb = nieuwe StringBuilder (s); while (sb.length ()> 0 && sb.charAt (0) == '0') {sb.deleteCharAt (0); } return sb.toString (); } String removeTrailingZeroes (String s) {StringBuilder sb = nieuwe StringBuilder (s); while (sb.length ()> 0 && sb.charAt (sb.length () - 1) == '0') {sb.setLength (sb.length () - 1); } return sb.toString (); }

Merk op dat we StringBuilder.setLength () in plaats van StringBuilder.deleteCharAt () wanneer we volgnullen verwijderen, omdat het ook de laatste paar tekens verwijdert en het performanter is.

Als wij wil geen lege Draad als de invoer alleen nullen bevat, hoeven we alleen maar te doen stop de lus als er nog maar één teken over is.

Daarom wijzigen we de lusvoorwaarde:

String removeLeadingZeroes (String s) {StringBuilder sb = nieuwe StringBuilder (s); while (sb.length ()> 1 && sb.charAt (0) == '0') {sb.deleteCharAt (0); } return sb.toString (); } String removeTrailingZeroes (String s) {StringBuilder sb = nieuwe StringBuilder (s); while (sb.length ()> 1 && sb.charAt (sb.length () - 1) == '0') {sb.setLength (sb.length () - 1); } return sb.toString (); }

3. Met behulp van String.subString ()

In deze oplossing wanneer we voorloop- of volgnullen verwijderen, we zoek de positie van het eerste of laatste niet-nul-teken.

Daarna hoeven we alleen nog maar te bellen deelstring (), om de overige onderdelen te retourneren:

String removeLeadingZeroes (String s) {int index; voor (index = 0; index = 0; index--) {if (s.charAt (index)! = '0') {pauze; }} retourneert s.substring (0, index + 1); }

Merk op dat we de variabele moeten declareren inhoudsopgave vóór de for-lus omdat we de variabele buiten het bereik van de lus willen gebruiken.

Merk ook op dat we sindsdien handmatig naar niet-nul tekens moeten zoeken String.indexOf () en String.lastIndexOf () werken alleen voor exacte matching.

Als wij wil geen lege Draad, we moeten hetzelfde doen als voorheen: verander de lusconditie:

String removeLeadingZeroes (String s) {int index; for (index = 0; index 0; index--) {if (s.charAt (index)! = '0') {break; }} retourneert s.substring (0, index + 1); }

4. Apache Commons gebruiken

Apache Commons heeft veel nuttige klassen, waaronder org.apache.commons.lang.StringUtils. Om preciezer te zijn, deze klasse bevindt zich in Apache Commons Lang3.

4.1. Afhankelijkheden

We kunnen Apache Commons Lang3 gebruiken door deze afhankelijkheid in te voegen in onze pom.xml het dossier:

 org.apache.commons commons-lang3 3.8.1 

4.2. Implementatie

In de StringUtils klasse, we hebben de methoden stripStart () en stripEnd (). Ze verwijderen respectievelijk voor- en achterliggende tekens.

Omdat het precies is wat we nodig hebben, is onze oplossing vrij eenvoudig:

String removeLeadingZeroes (String s) {return StringUtils.stripStart (s, "0"); } String removeTrailingZeroes (String s) {return StringUtils.stripEnd (s, "0"); }

Helaas kunnen we niet configureren of we alle instanties willen verwijderen of niet. Daarom moeten we het handmatig bedienen.

Als de ingang niet leeg was, maar de gestripte Draad leeg is, dan moeten we precies één nul teruggeven:

String removeLeadingZeroes (String s) {String stripped = StringUtils.stripStart (s, "0"); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } terugkeer gestript; } String removeTrailingZeroes (String s) {String stripped = StringUtils.stripEnd (s, "0"); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } terugkeer gestript; }

Merk op dat deze methoden een Draad als hun tweede parameter. Dit Draad vertegenwoordigt een reeks tekens, niet een reeks die we willen verwijderen.

Als we bijvoorbeeld slagen “01”, verwijderen ze alle voor- of achterliggende tekens, dat zijn beide ‘0' of ‘1'.

5. Guava gebruiken

Guava biedt ook veel hulpprogramma-klassen. Voor dit probleem kunnen we gebruiken com.google.common.base.CharMatcher, die hulpprogramma's biedt voor interactie met overeenkomende tekens.

5.1. Afhankelijkheden

Om Guava te gebruiken, moeten we de volgende afhankelijkheden toevoegen aan onze pom.xml het dossier:

 com.google.guava guave 27.0.1-jre 

Merk op dat als we Guava in een Android-applicatie willen gebruiken, we versie 27.0-android in plaats daarvan.

5.2. Implementatie

In ons geval zijn we geïnteresseerd in trimLeadingFrom () en trimTrailingFrom ().

Zoals hun naam doet vermoeden, verwijderen ze elk voorloop- of volgletter uit een Draad, die overeenkomt met de CharMatcher:

String removeLeadingZeroes (String s) {return CharMatcher.is ('0'). TrimLeadingFrom (s); } String removeTrailingZeroes (String s) {return CharMatcher.is ('0'). TrimTrailingFrom (s); }

Ze hebben dezelfde kenmerken als de Apache Commons-methoden die we hebben gezien.

Daarom, als we niet alle nullen willen verwijderen, kunnen we dezelfde truc gebruiken:

String removeLeadingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimLeadingFrom (s); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } terugkeer gestript; } String removeTrailingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimTrailingFrom (s); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } terugkeer gestript; }

Merk op dat met CharMatcher we kunnen complexere matchingsregels maken.

6. Gebruik van reguliere expressies

Omdat ons probleem een ​​probleem met het matchen van patronen is, kunnen we reguliere expressies gebruiken: we willen alle nullen aan het begin of het einde matchen van een Draad.

Bovendien willen we die overeenkomende nullen verwijderen. Met andere woorden: we willen vervang ze door niets, of met andere woorden, een leegte Draad.

We kunnen precies dat doen met de String.replaceAll () methode:

String removeLeadingZeroes (String s) {return s.replaceAll ("^ 0+", ""); } String removeTrailingZeroes (String s) {return s.replaceAll ("0 + $", ""); }

Als we niet alle nullen willen verwijderen, kunnen we dezelfde oplossing gebruiken die we hebben gebruikt met Apache Commons en Guava. Er is echter een pure manier om dit te doen met reguliere expressies: we moeten een patroon opgeven dat niet bij het geheel past Draad.

Op die manier, als de invoer alleen nullen bevat, zal de regexp-engine er precies één uit de overeenkomst houden. We kunnen dit doen met de volgende patronen:

String removeLeadingZeroes (String s) {return s.replaceAll ("^ 0 + (?! $)", ""); } String removeTrailingZeroes (String s) {return s.replaceAll ("(?! ^) 0 + $", ""); }

Let daar op “(?!^)” en “(?!$)” betekent dat dit niet het begin of het einde is van de Draad respectievelijk.

7. Conclusie

In deze zelfstudie hebben we verschillende manieren gezien om voorloop- en volglettertekens uit een Draad. De keuze tussen deze implementaties is vaak simpelweg persoonlijke voorkeur.

Zoals gewoonlijk zijn de voorbeelden beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found