영숫자 텍스트에서 선행 0을 제거하는 방법?


228

SO에서 0을 접두사로 사용하는 방법에 대한 질문을 보았습니다. 그러나 다른 방법은 아닙니다!

영숫자 텍스트에서 선행 0을 제거하는 방법을 제안 할 수 있습니까? 내장 API가 있습니까? 또는 선행 0을 자르는 방법을 작성해야합니까?

예:

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

정규식은이 작업에 가장 적합한 도구입니다. 문제 사양에 따라 달라집니다. 다음은 선행 0을 제거하지만 필요한 경우 1을 남겨 둡니다 (즉 "0", 빈 문자열로 바뀌지 않습니다 ).

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

^앵커 확인 있는지 확인합니다 0+일치되는 입력의 시작 부분입니다. (?!$)전체가 아닌 문자열이 일치하게 될 부정적 예측을 보장합니다.

테스트 하네스 :

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
jai

4
@Greg :이 질문은 JavaScript가 아닌 Java에 관한 것입니다. Java SE는 버전 1.4 이후에 String.replaceFirst () 메소드를 가지고 있습니다.
Jonik

5
s.replaceFirst ( "^ 0 + (?! $)", "")에 trim ()을 추가하면 s.trim (). replaceFirst ( "^ 0 + (?! $)", "")가 도움이됩니다. 패딩 된 공간 제거
AVA

2
그런 간단한 작업에 정규 표현식이 약간 비싸지 않습니까?
demongolem

5
이것은 Kotlin에서 작동하지 않으므로 Regex에 대해 명시해야합니다..replaceFirst("^0+(?!$)".toRegex(), "")
mkabatek

100

Apache Commons LangStringUtils 클래스를 다음과 같이 사용할 수 있습니다 .

StringUtils.stripStart(yourString,"0");

"0"에만 문제가 있습니까? @Hamilton Rodrigues
PhoonOne

2
"0"에서만 이것을 사용하면 ""를 돌려줍니다. 이것이 원하는 효과가 아닌지주의하십시오.
DARKPRINCE

불쾌한 원인은 질문의 사용 사례에 적합합니다. 빠른 해결책을 위해 여기에도 도움이되었습니다. 고마워!
Gabriel Amazonas Mesquita

32

정규식은 어떻습니까?

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

^문자열의 시작에 앵커 (나는 당신의 문자열이 여기에 여러 줄 수없는 상황에서 믿고있어, 그렇지 않으면 당신은 조사해야 할 수 있습니다 \A입력의 시작이 아니라 라인의 시작을위한). 0*수단은 0 개 이상의 0문자를 (당신은 할 수 사용 0+뿐만 아니라). 은 replaceFirst단지 모든 대체 0아무것도 시작 부분에 문자를.

바드처럼, 앞에 0의 당신의 정의가 돌려 포함되지 않습니다, 경우 "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
공간 검사는 질문에 따르지 않지만 대답이 가장 빨리 실행될 것이라고 생각합니다.
존 파울러

@JohnFowler 10x 이상 2 년 후에 고쳐

1
루프가 0 만 찾으면 메소드는 끝에 리턴이 필요합니다. ""를 반환; 또는 "0"을 반환합니다. 적어도 하나의 제로를 원한다면
slipperyseal

@ slipperyseal 나는 당신이 당신의 요구에 따라 그것을 바꿀 수 있도록 그것을 열어 두었지만 사람들이 복사 / 붙여 넣는 경향이 있기 때문에 항상 기본 행동을 취하는 것은 나쁜 생각이 아닙니다. 댓글 주셔서 감사합니다
magiccrafter

14

thelost의 Apache Commons 답변과 함께 가기 위해 guava 라이브러리를 사용하십시오 (Google의 범용 Java 유틸리티 라이브러리는 사소한 Java 프로젝트의 클래스 경로에 있어야 함), CharMatcher를 사용 합니다 .

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

+1, 구아바를 사용하는 모든 프로젝트에 대한 정답. (그리고 지금 2012 년에 그 한다 거의 모든 자바 프로젝트를 의미한다.)
Jonik

1
@Cowan "0"에만 문제가 있습니까? Will CharMatcher.is ( '0'). trimLeadingFrom ( "0"); "0"또는 빈 문자열을 반환 하시겠습니까?
PhoonOne

@PhoonOne : 방금 이것을 테스트했습니다. 빈 문자열을 반환합니다.
Stephan202

10

Kotlin을 사용하는 경우 필요한 유일한 코드입니다.

yourString.trimStart('0')

5

당신은 할 수 있습니다 : String s = Integer.valueOf("0001007").toString();


2
영숫자를 처리하지 않습니다.
slaman

4

Apache Commons StringUtils클래스를 사용하십시오 .

StringUtils.strip(String str, String stripChars);

2
경고! 이것은 선행 및 종료 0을 제거하여 원하는 것이 아닐 수 있습니다.
Jens Bannmann

18
StringUtils.stripStart ()를 사용하여 선행 0 만 제거 할 수 있습니다.
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

대답 중 일부가 제안하는대로 정규 표현식을 사용하는 것이 좋은 방법입니다. 정규식을 사용하지 않으려면 다음 코드를 사용할 수 있습니다.

String s = "00a0a121";

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

이것은 대신 magiccrafter approchString사용 하여 많은 것을 만들 수 있습니다 .
AxelH

1

그렇게하는 것이 너무 쉽다고 생각합니다. 처음부터 문자열을 반복하고 0이 아닌 문자를 찾을 때까지 0을 제거 할 수 있습니다.

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

(나와 같이) 문자열의 각 "단어"에서 모든 선행 0을 제거해야하는 경우 다음에 대한 @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"있습니다.


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

정규식 또는 외부 라이브러리를 사용하지 않으려는 경우 "for"로 할 수 있습니다 :

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루프가 너무 많으면 1000 개가 있다면 0...
AxelH

0

나는 몇 가지 벤치 마크 테스트를했고 가장 빠른 방법은이 솔루션이라는 것을 알았습니다.

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

특히 정규 표현식은 긴 반복에서 매우 느립니다. (일괄 처리를위한 가장 빠른 방법을 찾아야했습니다.)


-2

그리고 0이 아닌 첫 번째 문자 만 검색하는 것은 어떻습니까?

[1-9]\d+

이 정규식은 1에서 9 사이의 첫 번째 숫자와 임의의 숫자를 찾으 므로 "00012345"의 경우 "12345"를 반환합니다 . 영숫자 문자열에 쉽게 적용 할 수 있습니다.


이것은 이후에도 0을 허용하지 않습니다.
Nishant Dongare
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.