วิธีลบศูนย์นำหน้าจากข้อความตัวอักษรและตัวเลข


228

ฉันเห็นคำถามเกี่ยวกับวิธีนำหน้าค่าศูนย์ที่นี่ใน SO แต่ไม่ใช่วิธีอื่น!

พวกคุณช่วยแนะนำฉันได้อย่างไรว่าจะลบศูนย์นำหน้าด้วยตัวอักษรและตัวเลขได้หรือไม่ มี API ในตัวหรือฉันต้องเขียนวิธีในการตัดค่าศูนย์นำหน้าหรือไม่

ตัวอย่าง:

01234 converts to 1234
0001234a converts to 1234a
001234-a converts to 1234-a
101234 remains as 101234
2509398 remains as 2509398
123z remains as 123z
000002829839 converts to 2829839

คำตอบ:


617

Regex เป็นเครื่องมือที่ดีที่สุดสำหรับงาน สิ่งที่ควรขึ้นอยู่กับข้อกำหนดของปัญหา ต่อไปนี้จะลบศูนย์นำหน้า แต่จะทิ้งไว้ถ้าจำเป็น (เช่นจะไม่เปลี่ยน"0"เป็นสตริงว่างเปล่า)

s.replaceFirst("^0+(?!$)", "")

^สมอจะทำให้แน่ใจว่า0+มีการจับคู่เป็นจุดเริ่มต้นของการป้อนข้อมูล (?!$)เชิงลบ lookahead เพื่อให้แน่ใจว่าไม่สตริงทั้งหมดจะถูกจับคู่

สายรัดทดสอบ:

String[] in = {
    "01234",         // "[1234]"
    "0001234a",      // "[1234a]"
    "101234",        // "[101234]"
    "000002829839",  // "[2829839]"
    "0",             // "[0]"
    "0000000",       // "[0]"
    "0000009",       // "[9]"
    "000000z",       // "[z]"
    "000000.z",      // "[.z]"
};
for (String s : in) {
    System.out.println("[" + s.replaceFirst("^0+(?!$)", "") + "]");
}

ดูสิ่งนี้ด้วย


21
ขอบคุณ. และคุณได้ทดสอบอย่างโหดเหี้ยม;) ยอดเยี่ยม !! +1 สำหรับการทดสอบ
ใจ

4
@Greg: คำถามนี้เกี่ยวกับ Java ไม่ใช่ JavaScript Java SE มีเมธอดString.replaceFirst ()ตั้งแต่เวอร์ชัน 1.4
Jonik

5
การเพิ่ม trim () ไปยัง s.replaceFirst ("^ 0 + (?! $)", "") (เช่น s.trim (). replaceFirst ("^ 0 + (?! $)", "") จะช่วย ในการลบช่องว่างเบาะ!
AVA

2
regex ไม่แพงเลยสำหรับงานง่าย ๆ เหรอ?
demongolem

5
สิ่งนี้ไม่ทำงานใน Kotlin คุณต้องมีความชัดเจนเกี่ยวกับ Regex.replaceFirst("^0+(?!$)".toRegex(), "")
mkabatek

100

คุณสามารถใช้คลาสStringUtilsจากApache Commons Langดังนี้:

StringUtils.stripStart(yourString,"0");

สิ่งนี้มีปัญหากับ "0" เพียงอย่างเดียวหรือไม่ @Hamilton Rodrigues
PhoonOne

2
หากใช้สิ่งนี้กับ "0" เพียงอย่างเดียวมันจะคืน "" ดังนั้นถ้านี่ไม่ใช่ผลที่ต้องการ
dARKpRINCE

Upvoted ทำให้มันใช้งานได้สำหรับกรณีการใช้งานในคำถามที่ถาม ช่วยฉันด้วยที่นี่ด้วยเพื่อแก้ปัญหาอย่างรวดเร็ว ขอบคุณ!
Gabriel Amazonas Mesquita

32

วิธีเกี่ยวกับวิธี regex:

String s = "001234-a";
s = s.replaceFirst ("^0*", "");

^เบรกไปยังจุดเริ่มต้นของสตริง (ฉันสมมติจากบริบทสายของคุณไม่ได้หลายสายที่นี่มิฉะนั้นคุณอาจจะต้องดูเป็น\Aจุดเริ่มต้นของการป้อนข้อมูลแทนที่จะเริ่มต้นของบรรทัด) 0*หมายถึงศูนย์หรือมากกว่า0ตัวอักษร (คุณสามารถใช้0+เช่นกัน) replaceFirstเพียงแทนที่ทุกคนที่0ตัวละครที่เริ่มต้นด้วยอะไร

และถ้าเช่น Vadzim นิยามของเลขศูนย์นำหน้าของคุณไม่รวมการเปลี่ยน"0"(หรือ"000"สตริงที่คล้ายกัน) เป็นสตริงว่าง (ความคาดหวังที่เพียงพอตามเหตุผล) เพียงแค่ใส่กลับถ้าจำเป็น:

String s = "00000000";
s = s.replaceFirst ("^0*", "");
if (s.isEmpty()) s = "0";

6
มีปัญหากับ "0" เพียงอย่างเดียว
Vadzim

23

วิธีที่ชัดเจนโดยไม่ต้องใช้ regExp และไลบรารีภายนอกใด ๆ

public static String trimLeadingZeros(String source) {
    for (int i = 0; i < source.length(); ++i) {
        char c = source.charAt(i);
        if (c != '0') {
            return source.substring(i);
        }
    }
    return ""; // or return "0";
}

1
แม้ว่าการตรวจสอบพื้นที่ของคุณไม่เป็นไปตามคำถาม แต่ฉันคิดว่าคำตอบของคุณจะดำเนินการได้เร็วที่สุด
John Fowler

@ JohnFowler 10x สำหรับการจับแก้ไขหลังจาก 2 ปีขึ้นไป
magiccrafter

1
และวิธีการที่ต้องการผลตอบแทนในตอนท้ายถ้าห่วงพบเพียงศูนย์ ส่งคืน ""; หรือส่งคืน "0"; ถ้าคุณต้องการอย่างน้อยหนึ่งศูนย์
ลื่นไถล

@slipperyseal ฉันเปิดไว้ค้างไว้เพื่อให้คุณสามารถเปลี่ยนได้ตามความต้องการของคุณ แต่เนื่องจากคนมักจะคัดลอก / วางจึงไม่ใช่ความคิดที่ดีที่จะมีพฤติกรรมเริ่มต้นเสมอ ขอบคุณสำหรับความคิดเห็น
magiccrafter

14

เพื่อไปกับคำตอบ Apache Commons ที่เก่าที่สุด: การใช้guava-libraries ( ไลบรารียูทิลิตี้ Java วัตถุประสงค์ทั่วไปของ Google ที่ฉันจะโต้แย้งตอนนี้ควรอยู่ใน classpath ของโครงการ Java ที่ไม่สำคัญ) ซึ่งจะใช้CharMatcher :

CharMatcher.is('0').trimLeadingFrom(inputString);

+1 คำตอบที่ถูกต้องสำหรับโครงการใด ๆ ที่ใช้ Guava (และในปี 2012 นี้น่าจะหมายถึงโครงการ Java ใด ๆ เลยทีเดียว)
Jonik

1
@Canan สิ่งนี้มีปัญหากับ "0" เพียงอย่างเดียวหรือไม่ จะ CharMatcher.is ('0') trimLeadingFrom ("0"); ส่งคืน "0" หรือสตริงว่าง?
PhoonOne

@PhoonOne: ฉันเพิ่งทดสอบสิ่งนี้ มันจะส่งกลับสตริงที่ว่างเปล่า
Stephan202


5

คุณสามารถทำได้: String s = Integer.valueOf("0001007").toString();


2
จะไม่จัดการกับตัวอักษรและตัวเลข
slaman

4

ใช้StringUtilsคลาสApache Commons :

StringUtils.strip(String str, String stripChars);

2
คำเตือน! สิ่งนี้จะตัดเลขศูนย์ที่นำหน้าและสิ้นสุดซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ
Jens Bannmann

18
คุณสามารถตัดเลขศูนย์นำหน้าโดยใช้ StringUtils.stripStart ()
Josh Rosen


2

ใช้ Regexp กับกลุ่ม:

Pattern pattern = Pattern.compile("(0*)(.*)");
String result = "";
Matcher matcher = pattern.matcher(content);
if (matcher.matches())
{
      // first group contains 0, second group the remaining characters
      // 000abcd - > 000, abcd
      result = matcher.group(2);
}

return result;

2

การใช้ regex เป็นคำตอบที่แนะนำเป็นวิธีที่ดีในการทำเช่นนั้น หากคุณไม่ต้องการใช้ regex คุณสามารถใช้รหัสนี้ได้:

String s = "00a0a121";

while(s.length()>0 && s.charAt(0)=='0')
{
   s = s.substring(1); 
}

สิ่งนี้สามารถสร้างString... ใช้magiccrafter approchแทน
AxelH

1

ฉันคิดว่ามันง่ายมากที่จะทำเช่นนั้น คุณสามารถวนซ้ำสตริงจากจุดเริ่มต้นและลบศูนย์จนกว่าคุณจะพบอักขระไม่เป็นศูนย์

int lastLeadZeroIndex = 0;
for (int i = 0; i < str.length(); i++) {
  char c = str.charAt(i);
  if (c == '0') {
    lastLeadZeroIndex = i;
  } else {
    break;
  }
}

str = str.subString(lastLeadZeroIndex+1, str.length());

1

หากคุณ (เช่นฉัน) ต้องลบศูนย์นำทั้งหมดออกจาก "word" แต่ละรายการในสตริงคุณสามารถแก้ไข @polygenelubricants 'คำตอบต่อไปนี้:

String s = "003 d0g 00ss 00 0 00";
s.replaceAll("\\b0+(?!\\b)", "");

ซึ่งผลลัพธ์ใน:

3 d0g ss 0 0 0

1

โดยไม่ต้องใช้Regexหรือsubstring()ฟังก์ชั่นStringที่จะไม่มีประสิทธิภาพ -

public static String removeZero(String str){
        StringBuffer sb = new StringBuffer(str);
        while (sb.length()>1 && sb.charAt(0) == '0')
            sb.deleteCharAt(0);
        return sb.toString();  // return in String
    }

0

คุณอาจจะเปลี่ยน"^0*(.*)"ไป"$1"ด้วย regex


1
ปัญหาเดียวที่ฉันเห็นที่นี่คือสิ่งนี้อาจแทนที่ศูนย์เดียว '0' เป็นค่าว่าง
Dilipkumar J

0
       String s="0000000000046457657772752256266542=56256010000085100000";      
    String removeString="";

    for(int i =0;i<s.length();i++){
      if(s.charAt(i)=='0')
        removeString=removeString+"0";
      else 
        break;
    }

    System.out.println("original string - "+s);

    System.out.println("after removing 0's -"+s.replaceFirst(removeString,""));

0

หากคุณไม่ต้องการใช้ regex หรือไลบรารี่ภายนอก คุณสามารถทำได้ด้วย "สำหรับ":

String input="0000008008451"
String output = input.trim();
for( ;output.length() > 1 && output.charAt(0) == '0'; output = output.substring(1));

System.out.println(output);//8008451

Stringสร้างมากเกินไปในช่วงลูปนี้ ... หากมี 1,000 0...
AxelH

0

ฉันได้ทำการทดสอบเกณฑ์มาตรฐานและพบว่าวิธีที่เร็วที่สุด (โดยไกล) คือวิธีแก้ปัญหานี้:

    private static String removeLeadingZeros(String s) {
      try {
          Integer intVal = Integer.parseInt(s);
          s = intVal.toString();
      } catch (Exception ex) {
          // whatever
      }
      return s;
    }

โดยเฉพาะอย่างยิ่งการแสดงออกปกติช้ามากในการทำซ้ำนาน (ฉันจำเป็นต้องค้นหาวิธีที่เร็วที่สุดสำหรับ batchjob)


-2

แล้วการค้นหาตัวละครที่ไม่ใช่ศูนย์แรกล่ะ

[1-9]\d+

regex นี้พบหลักแรกระหว่างวันที่ 1 และ 9 ตามด้วยหมายเลขของตัวเลขใด ๆ ดังนั้นสำหรับ"00012345"มันกลับ"12345" มันสามารถปรับให้เข้ากับสตริงตัวอักษรและตัวเลขได้อย่างง่ายดาย


ซึ่งจะไม่อนุญาตให้มีศูนย์หลังจากนั้นเช่นกัน
Nishant Dongare
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.