Làm thế nào để loại bỏ các số không hàng đầu khỏi văn bản chữ và số?


228

Tôi đã thấy các câu hỏi về cách tạo tiền tố số 0 ở đây trong SO. Nhưng không phải là cách khác!

Các bạn có thể gợi ý cho tôi cách loại bỏ các số 0 đứng đầu trong văn bản chữ và số không? Có bất kỳ API tích hợp nào không hoặc tôi có cần viết một phương thức để cắt các số 0 đứng đầu không?

Thí dụ:

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

Câu trả lời:


617

Regex là công cụ tốt nhất cho công việc; những gì nó nên được phụ thuộc vào đặc điểm kỹ thuật vấn đề. Sau đây sẽ loại bỏ các số 0 đứng đầu, nhưng để lại một số không cần thiết (nghĩa là nó sẽ không chuyển "0"sang một chuỗi trống).

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

Các ^neo sẽ đảm bảo rằng các 0+bị phù hợp là vào lúc bắt đầu của đầu vào. Giao diện (?!$)phủ định đảm bảo rằng không phải toàn bộ chuỗi sẽ được khớp.

Khai thác thử nghiệm:

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+(?!$)", "") + "]");
}

Xem thêm


21
Cảm ơn bạn. Và bạn đã kiểm tra một cách tàn nhẫn;) Tuyệt vời !! +1 cho các bài kiểm tra.
jai

4
@Greg: Câu hỏi này là về Java, không phải JavaScript. Java SE đã có phương thức String.replaceFirst () kể từ phiên bản 1.4.
Jonik

5
thêm trim () vào s.replaceFirst ("^ 0 + (?! $)", "") (tức là s.trim (). thayFirst ("^ 0 + (?! $)", "") sẽ giúp trong việc loại bỏ không gian đệm!
AVA

2
không phải regex hơi đắt cho một nhiệm vụ đơn giản như vậy sao?
demongolem 24/07/2015

5
Điều này không hoạt động trong Kotlin, bạn cần phải rõ ràng về Regex.replaceFirst("^0+(?!$)".toRegex(), "")
mkabatek

100

Bạn có thể sử dụng lớp StringUtils từ Apache Commons Lang như thế này:

StringUtils.stripStart(yourString,"0");

Điều này có vấn đề với "0" một mình? @ Hamiltoniltonues
PhoonOne 17/2/2015

2
Nếu chỉ sử dụng điều này trên "0", nó sẽ trả lại "". Vì vậy, quan tâm nếu đây không phải là hiệu quả mong muốn.
dARKpRINCE

Upvote nguyên nhân nó hoạt động cho các trường hợp sử dụng trong câu hỏi được hỏi. Đã giúp tôi ở đây quá cho một giải pháp nhanh chóng. Cám ơn!
Gabriel Amazonas Mesquita

32

Làm thế nào về cách regex:

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

Các ^điểm neo ở đầu chuỗi (Tôi giả sử từ ngữ cảnh chuỗi của bạn không phải là nhiều dòng ở đây, nếu không bạn có thể cần xem xét \Ađể bắt đầu nhập thay vì bắt đầu dòng). Có 0*nghĩa là không hoặc nhiều 0ký tự (bạn cũng có thể sử dụng 0+). Việc replaceFirstthay thế tất cả những 0nhân vật lúc đầu không có gì.

Và nếu, giống như Vadzim, định nghĩa về các số 0 đứng đầu của bạn không bao gồm biến "0"(hoặc "000"hoặc các chuỗi tương tự) thành một chuỗi trống (một kỳ vọng đủ hợp lý), chỉ cần đặt lại nếu cần:

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

6
Nó có vấn đề với "0" một mình.
Vadzim

23

Một cách rõ ràng mà không cần regExp và bất kỳ thư viện bên ngoài.

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
Mặc dù kiểm tra không gian của bạn không theo câu hỏi, tuy nhiên tôi nghĩ rằng câu trả lời của bạn sẽ thực hiện nhanh nhất.
John Fowler

@JohnFowler 10 lần để bắt, cố định sau hơn 2 năm
phép thuật sau

1
Và phương thức cần trả về ở cuối nếu vòng lặp chỉ tìm thấy số không. trở về ""; hoặc trả về "0"; nếu bạn muốn có ít nhất một số 0
slipperyseal

@slipperyseal Tôi để nó mở để bạn có thể thay đổi dựa trên nhu cầu của mình nhưng vì mọi người có xu hướng sao chép / dán, nên việc luôn có hành vi mặc định là một ý tưởng không tồi. cảm ơn vì bình luận
Magiccrafter 23/218

14

Để đi với câu trả lời Apache Commons của thelost: sử dụng các thư viện ổi (thư viện tiện ích Java đa năng của Google mà tôi cho rằng bây giờ nên có trên đường dẫn của bất kỳ dự án Java không tầm thường nào), điều này sẽ sử dụng CharMatcher :

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

+1, câu trả lời đúng cho bất kỳ dự án nào sử dụng Guava. (Và bây giờ là vào năm 2012 nên có nghĩa là khá nhiều bất kỳ dự án Java.)
Jonik

1
@Cowan Điều này có vấn đề với "0" không? Will CharMatcher.is ('0'). TrimLeadFrom ("0"); Trả về "0" hoặc chuỗi rỗng?
PhoonOne 17/2/2015

@PhoonOne: Tôi mới thử cái này; nó trả về chuỗi rỗng.
Stephan202

10

Nếu bạn đang sử dụng Kotlin Đây là mã duy nhất mà bạn cần:

yourString.trimStart('0')

5

Bạn chỉ có thể làm: String s = Integer.valueOf("0001007").toString();


2
Không xử lý chữ và số.
Slaman

4

Sử dụng StringUtilslớp Apache Commons :

StringUtils.strip(String str, String stripChars);

2
CẢNH BÁO! Điều này sẽ loại bỏ các số 0 đứng đầu và kết thúc, có thể không phải là những gì bạn muốn.
Jens Bannmann

18
Bạn chỉ có thể loại bỏ các số 0 đứng đầu bằng StringUtils.stripStart ().
Josh Rosen


2

Sử dụng Regapi với các nhóm:

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

Sử dụng regex như một số câu trả lời gợi ý là một cách tốt để làm điều đó. Nếu bạn không muốn sử dụng regex thì bạn có thể sử dụng mã này:

String s = "00a0a121";

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

Điều này có thể tạo ra rất nhiều String... sử dụng phép thuật sau khi phê duyệt .
AxelH

1

Tôi nghĩ rằng nó rất dễ dàng để làm điều đó. Bạn chỉ có thể lặp qua chuỗi từ đầu và loại bỏ các số không cho đến khi bạn tìm thấy một char không bằng không.

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

Nếu bạn (như tôi) cần xóa tất cả các số 0 đứng đầu khỏi mỗi "từ" trong một chuỗi, bạn có thể sửa đổi câu trả lời của @polygenelubricants thành như sau:

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

kết quả là:

3 d0g ss 0 0 0

1

Không sử dụng Regexhoặc substring()chức năng Stringmà sẽ không hiệu quả -

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

Bạn có thể thay thế "^0*(.*)"để "$1"có regex


1
Vấn đề duy nhất tôi thấy ở đây là điều này có thể thay thế một số 0 '0' thành một khoảng trống.
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

Nếu bạn không muốn sử dụng regex hoặc thư viện bên ngoài. Bạn có thể làm với "cho":

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

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

Quá nhiều Stringđược tạo trong vòng lặp này ... nếu có 1000 0...
AxelH

0

Tôi đã thực hiện một số bài kiểm tra điểm chuẩn và thấy rằng cách nhanh nhất (cho đến nay) là giải pháp này:

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

Đặc biệt là các biểu thức chính quy rất chậm trong một lần lặp dài. (Tôi cần tìm ra cách nhanh nhất cho một đợt.)


-2

Và những gì về việc chỉ tìm kiếm các ký tự khác không đầu tiên?

[1-9]\d+

Regex này tìm thấy chữ số đầu tiên trong khoảng từ 1 đến 9, theo sau là bất kỳ số chữ số nào, vì vậy với "00012345", nó trả về "12345" . Nó có thể dễ dàng điều chỉnh cho các chuỗi chữ và số.


Điều này sẽ không cho phép bằng không sau đó là tốt.
Nishant Dongare
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.