Odstráňte úvodné a koncové znaky z reťazca

1. Úvod

V tomto krátkom návode sa dozvieme niekoľko spôsobov, ako odstrániť úvodné a koncové znaky z a String. Kvôli jednoduchosti v príkladoch odstránime nuly.

S každou implementáciou vytvoríme dve metódy: jednu pre vedenie a jednu pre koncové nuly.

Tento problém má okrajový prípad: čo chceme robiť, keď vstup obsahuje iba nuly? Vráťte prázdne miesto String, alebo a String obsahujúci jednu nulu? V každom z riešení uvidíme implementácie pre oba prípady použitia.

Pre každú implementáciu máme jednotkové testy, ktoré nájdete na GitHub.

2. Pomocou StringBuilder

V našom prvom riešení vytvoríme a StringBuilder s originálom String, a odstránime nepotrebné znaky od začiatku alebo do konca:

String removeLeadingZeroes (String s) {StringBuilder sb = nový StringBuilder (s); while (sb.length ()> 0 && sb.charAt (0) == '0') {sb.deleteCharAt (0); } návrat sb.toString (); } String removeTrailingZeroes (String s) {StringBuilder sb = new StringBuilder (s); while (sb.length ()> 0 && sb.charAt (sb.length () - 1) == '0') {sb.setLength (sb.length () - 1); } návrat sb.toString (); }

Všimnite si, že to používame StringBuilder.setLength () namiesto StringBuilder.deleteCharAt () keď odstránime koncové nuly, pretože sa tým vymaže aj posledných pár znakov a bude to výkonnejšie.

Keby sme Nechcem vrátiť prázdny String keď vstup obsahuje iba nuly, jediné, čo musíme urobiť, je urobiť zastavte slučku, ak zostal iba jeden znak.

Preto zmeníme podmienku slučky:

String removeLeadingZeroes (String s) {StringBuilder sb = nový StringBuilder (s); while (sb.length ()> 1 && sb.charAt (0) == '0') {sb.deleteCharAt (0); } návrat sb.toString (); } String removeTrailingZeroes (String s) {StringBuilder sb = new StringBuilder (s); while (sb.length ()> 1 && sb.charAt (sb.length () - 1) == '0') {sb.setLength (sb.length () - 1); } návrat sb.toString (); }

3. Používanie String.subString ()

Keď v tomto riešení odstránime počiatočné alebo koncové nuly, urobíme to vyhľadať pozíciu prvého alebo posledného nenulového znaku.

Potom už len musíme volať podreťazec (), aby ste vrátili zostávajúce časti:

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

Všimnite si, že musíme deklarovať premennú index pred slučkou for, pretože chceme použiť premennú mimo rozsahu slučky.

Upozorňujeme tiež, že nenulové znaky musíme hľadať manuálne, pretože String.indexOf () a String.lastIndexOf () pracujte iba na presnú zhodu.

Keby sme Nechcem vrátiť prázdny String, musíme urobiť to isté ako predtým: zmeniť stav slučky:

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

4. Používanie Apache Commons

Apache Commons má veľa užitočných tried, vrátane org.apache.commons.lang.StringUtils. Presnejšie povedané, táto trieda sa nachádza v jazyku Apache Commons Lang3.

4.1. Závislosti

Môžeme použiť Apache Commons Lang3 vložením tejto závislosti do našej pom.xml spis:

 org.apache.commons commons-lang3 3.8.1 

4.2. Implementácia

V StringUtils triedy, máme metódy stripStart () a stripEnd (). Odstraňujú úvodné a koncové znaky.

Pretože je to presne to, čo potrebujeme, naše riešenie je celkom jednoduché:

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

Bohužiaľ to nemôžeme nakonfigurovať, ak chceme odstrániť všetky výskyty alebo nie. Preto to musíme ovládať manuálne.

Ak vstup nebol prázdny, ale odstránený String je prázdne, potom musíme vrátiť presne jednu nulu:

String removeLeadingZeroes (String s) {String stripped = StringUtils.stripStart (s, "0"); if (stripped.isEmpty () &&! s.isEmpty ()) {návrat "0"; } návrat zbavený; } String removeTrailingZeroes (String s) {String stripped = StringUtils.stripEnd (s, "0"); if (stripped.isEmpty () &&! s.isEmpty ()) {návrat "0"; } návrat zbavený; }

Upozorňujeme, že tieto metódy akceptujú a String ako ich druhý parameter. Toto String predstavuje množinu znakov, nie postupnosť, ktorú chceme odstrániť.

Napríklad ak prejdeme “01”, odstránia všetky úvodné alebo koncové znaky, ktoré sú buď ‘0' alebo ‘1'.

5. Používanie Guavy

Guava tiež poskytuje mnoho tried nástrojov. Na tento problém môžeme použiť com.google.common.base.CharMatcher, ktorá poskytuje užitočné metódy na interakciu so zodpovedajúcimi znakmi.

5.1. Závislosti

Ak chcete používať Guava, mali by sme do našej pridať nasledujúce závislosti pom.xml spis:

 com.google.guava guava 27.0.1-jre 

Upozorňujeme, že ak chceme používať Guava v aplikácii pre Android, mali by sme použiť verziu 27,0-android namiesto toho.

5.2. Implementácia

V našom prípade nás to zaujíma trimLeadingFrom () a trimTrailingFrom ().

Ako naznačuje ich názov, odstraňujú z a String, ktorý sa zhoduje s CharMatcher:

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

Majú rovnaké vlastnosti ako metódy Apache Commons, ktoré sme videli.

Ak teda nechceme odstrániť všetky nuly, môžeme použiť rovnaký trik:

String removeLeadingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimLeadingFrom (s); if (stripped.isEmpty () &&! s.isEmpty ()) {návrat "0"; } návrat zbavený; } String removeTrailingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimTrailingFrom (s); if (stripped.isEmpty () &&! s.isEmpty ()) {návrat "0"; } návrat zbavený; }

Všimnite si, že s CharMatcher môžeme vytvoriť zložitejšie pravidlá párovania.

6. Používanie regulárnych výrazov

Pretože náš problém je problém so zhodovaním vzorov, môžeme použiť regulárne výrazy: chceme spojiť všetky nuly na začiatku alebo na konci a String.

Okrem toho chceme odstrániť zodpovedajúce nuly. Inými slovami, chceme nahraďte ich ničím, alebo inými slovami prázdnymi String.

Presne to môžeme urobiť pomocou String.replaceAll () metóda:

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

Ak nechceme odstrániť všetky nuly, mohli by sme použiť rovnaké riešenie, aké sme použili s Apache Commons a Guava. Existuje však číry spôsob regulárneho výrazu: musíme poskytnúť vzor, ​​ktorý sa nezhoduje s celkom String.

Týmto spôsobom, ak vstup obsahuje iba nuly, modul regulárneho regulárneho výrazu udrží presne jednu mimo zhody. Môžeme to urobiť pomocou nasledujúcich vzorov:

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

Poznač si to “(?!^)” a “(?!$)” znamená, že to nie je začiatok ani koniec String resp.

7. Záver

V tomto tutoriáli sme videli niekoľko spôsobov, ako odstrániť vedúce a koncové znaky z a String. Voľba medzi týmito implementáciami je často jednoducho osobnou preferenciou.

Ako obvykle sú príklady k dispozícii na GitHub.