הסר דמויות מובילות ונגררות ממחרוזת

1. הקדמה

במדריך קצר זה נראה כמה דרכים להסיר תווים מובילים ונגררים מ- a חוּט. לשם הפשטות, נסיר אפסים בדוגמאות.

עם כל יישום, ניצור שתי שיטות: אחת להובלה ואחת לנגרר אחרי אפסים.

לבעיה זו יש מקרה יתרון: מה אנחנו רוצים לעשות, כאשר הקלט מכיל אפסים בלבד? להחזיר ריק חוּט, או א חוּט מכיל אפס יחיד? נראה יישומים עבור שני מקרי השימוש בכל אחד מהפתרונות.

יש לנו מבחני יחידות לכל יישום, אותם תוכלו למצוא ב- GitHub.

2. שימוש StringBuilder

בפתרון הראשון שלנו, ניצור StringBuilder עם המקור חוּטונמחק את התווים המיותרים מההתחלה או הסוף:

String removeLeadingZeroes (String s) {StringBuilder sb = StringBuilder new (s); בעוד (sb.length ()> 0 && sb.charAt (0) == '0') {sb.deleteCharAt (0); } להחזיר sb.toString (); } מחרוזת removeTrailingZeroes (מחרוזות) {StringBuilder sb = חדש StringBuilder (ים); בעוד (sb.length ()> 0 && sb.charAt (sb.length () - 1) == '0') {sb.setLength (sb.length () - 1); } להחזיר sb.toString (); }

שים לב, כי אנו משתמשים StringBuilder.setLength () במקום StringBuilder.deleteCharAt () כאשר אנו מסירים אפסים נגררים מכיוון שהוא גם מוחק את התווים האחרונים וזה ביצועי יותר.

אם אנחנו לא רוצה להחזיר ריק חוּט כאשר הקלט מכיל אפסים בלבד, הדבר היחיד שעלינו לעשות הוא לעשות עצור את הלולאה אם ​​נותרה רק דמות אחת.

לכן אנו משנים את מצב הלולאה:

String removeLeadingZeroes (String s) {StringBuilder sb = StringBuilder new (s); בעוד (sb.length ()> 1 && sb.charAt (0) == '0') {sb.deleteCharAt (0); } להחזיר sb.toString (); } מחרוזת removeTrailingZeroes (מחרוזות) {StringBuilder sb = חדש StringBuilder (ים); בעוד (sb.length ()> 1 && sb.charAt (sb.length () - 1) == '0') {sb.setLength (sb.length () - 1); } להחזיר sb.toString (); }

3. שימוש String.subString ()

בפתרון זה כאשר אנו מסירים אפסים מובילים או נגררים, אנו מצא את המיקום של התו הראשון או האחרון שאינו אפס.

אחרי זה, אנחנו רק צריכים להתקשר תשתית (), להחזרת החלקים הנותרים:

מחרוזת removeLeadingZeroes (מחרוזת) {int אינדקס; עבור (אינדקס = 0; אינדקס = 0; אינדקס--) {אם (s.charAt (אינדקס)! = '0') {הפסקה; }} להחזיר s.substring (0, אינדקס + 1); }

שים לב, שעלינו להכריז על המשתנה אינדקס לפני לולאת ה- for כי אנו רוצים להשתמש במשתנה מחוץ לתחום הלולאה.

שים לב גם כי עלינו לחפש תווים שאינם אפס באופן ידני, שכן String.indexOf () ו String.lastIndexOf () לעבוד רק לצורך התאמה מדויקת.

אם אנחנו לא רוצה להחזיר ריק חוּטעלינו לעשות את אותו הדבר כמו קודם: לשנות את מצב הלולאה:

מחרוזת removeLeadingZeroes (מחרוזת) {int אינדקס; עבור (אינדקס = 0; אינדקס 0; אינדקס--) {אם (s.charAt (אינדקס)! = '0') {הפסקה; }} להחזיר s.substring (0, אינדקס + 1); }

4. שימוש באפצ'י קומונס

ל- Apache Commons שיעורים שימושיים רבים, כולל org.apache.commons.lang.StringUtils. ליתר דיוק, שיעור זה נמצא באפצ'י קומונס לאנג 3.

4.1. תלות

אנו יכולים להשתמש ב- Apache Commons Lang3 על ידי הכנסת תלות זו לתוך שלנו pom.xml קוֹבֶץ:

 org.apache.commons commons-lang3 3.8.1 

4.2. יישום

בתוך ה StringUtils בכיתה, יש לנו את השיטות stripStart () ו stripEnd (). הם מסירים תווים מובילים ונגררים בהתאמה.

מכיוון שזה בדיוק מה שאנחנו צריכים, הפיתרון שלנו די פשוט:

String removeLeadingZeroes (String s) {return StringUtils.stripStart (s, "0"); } מחרוזת removeTrailingZeroes (מחרוזות) {להחזיר StringUtils.stripEnd (s, "0"); }

למרבה הצער, איננו יכולים להגדיר אם אנו רוצים להסיר את כל ההתרחשויות או לא. לכן, עלינו לשלוט בו באופן ידני.

אם הקלט לא היה ריק, אבל הפשט חוּט ריק, ואז עלינו להחזיר בדיוק אפס אחד:

String removeLeadingZeroes (String s) {String stripped = StringUtils.stripStart (s, "0"); אם (stripped.isEmpty () &&! s.isEmpty ()) {להחזיר "0"; } להחזיר חשוף; } String removeTrailingZeroes (String s) {String stripped = StringUtils.stripEnd (s, "0"); אם (stripped.isEmpty () &&! s.isEmpty ()) {להחזיר "0"; } להחזיר חשוף; }

שים לב, ששיטות אלה מקבלות א חוּט כפרמטר השני שלהם. זֶה חוּט מייצג קבוצה של תווים, ולא רצף שאנחנו רוצים להסיר.

למשל, אם נעבור “01”, הם יסירו את כל התווים המובילים או הנגררים ‘0' אוֹ ‘1'.

5. שימוש בגויאבה

גויאבה מספקת גם שיעורי שירות רבים. לבעיה זו אנו יכולים להשתמש com.google.common.base.CharMatcher, המספק שיטות שירות לאינטראקציה עם תווים תואמים.

5.1. תלות

כדי להשתמש בגויאבה, עלינו להוסיף את התלות הבאות שלנו pom.xml קוֹבֶץ:

 com.google.guava גויאבה 27.0.1-jre 

שים לב, שאם אנו רוצים להשתמש בגויאבה ביישום אנדרואיד, עלינו להשתמש בגרסה 27.0-אנדרואיד במקום זאת.

5.2. יישום

במקרה שלנו, אנו מעוניינים בכך trimLeadingFrom () ו trimTrailingFrom ().

כפי ששמם מרמז, הם מסירים כל תו מוביל או נגרר בהתאמה מ- חוּט, שתואם את CharMatcher:

מחרוזת removeLeadingZeroes (מחרוזות) {החזר CharMatcher.is ('0'). TrimLeadingFrom (s); } מחרוזת removeTrailingZeroes (String s) {return CharMatcher.is ('0'). TrimTrailingFrom (s); }

יש להם את אותם מאפיינים, כמו לשיטות ה- Apache Commons שראינו.

לכן, אם אנחנו לא רוצים להסיר את כל האפסים, נוכל להשתמש באותו טריק:

מחרוזת removeLeadingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimLeadingFrom (s); אם (stripped.isEmpty () &&! s.isEmpty ()) {להחזיר "0"; } להחזיר חשוף; } מחרוזת removeTrailingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimTrailingFrom (s); אם (stripped.isEmpty () &&! s.isEmpty ()) {להחזיר "0"; } להחזיר חשוף; }

שים לב, שעם CharMatcher אנו יכולים ליצור כללי התאמה מורכבים יותר.

6. שימוש בביטויים רגולריים

מכיוון שהבעיה שלנו היא בעיה בהתאמת תבניות, אנו יכולים להשתמש בביטויים רגולריים: אנחנו רוצים להתאים את כל האפסים בתחילת או בסוף של א חוּט.

נוסף על כך, אנו רוצים להסיר את האפסים התואמים האלה. במילים אחרות, אנחנו רוצים להחליף אותם בלא כלום, או במילים אחרות - ריק חוּט.

אנחנו יכולים לעשות בדיוק את זה, עם String.replaceAll () שיטה:

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

אם אנחנו לא רוצים להסיר את כל האפסים, נוכל להשתמש באותו פתרון שהשתמשנו בו עם Apache Commons ו- Guava. עם זאת, יש דרך ביטוי קבועה טהורה לעשות זאת: עלינו לספק דפוס שאינו תואם את השלם חוּט.

בדרך זו, אם הקלט מכיל אפסים בלבד, מנוע ה- regexp ימנע בדיוק אחד מהתאמה. אנו יכולים לעשות זאת בדפוסים הבאים:

מחרוזת removeLeadingZeroes (מחרוזות) {return s.replaceAll ("^ 0 + (?! $)", ""); } String removeTrailingZeroes (String s) {return s.replaceAll ("(?! ^) 0 + $", ""); }

ציין זאת “(?!^)” ו “(?!$)” פירושו שזה לא ההתחלה או הסוף של חוּט בהתאמה.

7. מסקנה

במדריך זה ראינו מספר דרכים להסיר תווים מובילים ונגררים מ- חוּט. הבחירה בין יישומים אלה היא לעתים קרובות פשוט העדפה אישית.

כרגיל, הדוגמאות זמינות ב- GitHub.


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