영숫자 텍스트에서 선행 0을 삭제하려면 어떻게 해야 합니까?
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
Regex는 작업에 가장 적합한 도구이며, 문제의 사양에 따라 달라집니다.아래는 선행 0을 제거하지만 필요한 경우 1을 남깁니다(즉, 회전만 하는 것이 아닙니다)."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+(?!$)", "") + "]");
}
「 」를 참조해 주세요.
Apache Commons Lang에서 String Utils 클래스를 다음과 같이 사용할 수 있습니다.
StringUtils.stripStart(yourString,"0");
regex 방식은 어떻습니까?
String s = "001234-a";
s = s.replaceFirst ("^0*", "");
그^
스트링의 선두에 앵커합니다(문맥상 당신의 스트링은 여기서 멀티 라인이 아니라고 가정합니다.그렇지 않으면, 당신이 조사할 필요가 있을 수 있습니다).\A
행의 시작이 아닌 입력의 시작)을 클릭합니다.그0*
0 이상을 의미합니다.0
문자(사용할 수 있습니다.0+
(도 마찬가지입니다).그replaceFirst
모든 것을 대신해서0
맨 앞에 있는 캐릭터들은 아무것도 없어요.
그리고 Vadzim과 마찬가지로 선행 0에 대한 정의에는 선회 기능이 포함되어 있지 않은 경우"0"
(또는"000"
또는 유사한 문자열)을 빈 문자열(합리적인 예상)로 만듭니다.필요한 경우 다시 넣기만 하면 됩니다.
String s = "00000000";
s = s.replaceFirst ("^0*", "");
if (s.isEmpty()) s = "0";
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";
}
Kotlin을 사용하는 경우 필요한 유일한 코드는 다음과 같습니다.
yourString.trimStart('0')
lost's Apache Commons의 답변으로 넘어가면 guava-libraries(Google의 범용 Java 유틸리티 라이브러리)를 사용하는 것이 일반적이지 않은 Java 프로젝트의 클래스 패스에 있어야 한다고 생각합니다.CharMatcher를 사용하는 것은 다음과 같습니다.
CharMatcher.is('0').trimLeadingFrom(inputString);
다음 작업을 수행할 수 있습니다.String s = Integer.valueOf("0001007").toString();
사용방법:
String x = "00123".replaceAll("^0*", ""); // -> 123
Apache Commons 클래스 사용:
StringUtils.strip(String str, String stripChars);
그룹에서 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;
몇 가지 답변에서 알 수 있듯이 regex를 사용하는 것이 좋은 방법입니다.regex 를 사용하지 않는 경우는, 다음의 코드를 사용할 수 있습니다.
String s = "00a0a121";
while(s.length()>0 && s.charAt(0)=='0')
{
s = s.substring(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());
(나처럼) 문자열의 각 "word"에서 선행 0을 모두 삭제할 필요가 있는 경우 @polygenelubricants의 응답을 다음과 같이 변경할 수 있습니다.
String s = "003 d0g 00ss 00 0 00";
s.replaceAll("\\b0+(?!\\b)", "");
그 결과, 다음과 같습니다.
3 d0g ss 0 0 0
「 」를 사용하지 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*(.*)"
로로 합니다."$1"
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,""));
regex 또는 외부 라이브러리를 사용하지 않는 경우."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
벤치마크 테스트를 실시한 결과, (지금까지) 가장 빠른 방법은 다음과 같습니다.
private static String removeLeadingZeros(String s) {
try {
Integer intVal = Integer.parseInt(s);
s = intVal.toString();
} catch (Exception ex) {
// whatever
}
return s;
}
특히 정규 표현은 긴 반복에서 매우 느립니다.(배치 작업을 위한 가장 빠른 방법을 찾아야 했습니다.)
코틀린을 사용하면 간단
value.trimStart('0')
0이 아닌 첫 번째 문자를 검색하면 어떨까요?
[1-9]\d+
이 정규식은 1과 9 사이의 첫 번째 자리 뒤에 임의의 자리 수를 찾기 때문에 "00012345"의 경우 "12345"를 반환합니다.영숫자 문자열에 쉽게 적응할 수 있습니다.
언급URL : https://stackoverflow.com/questions/2800739/how-to-remove-leading-zeros-from-alphanumeric-text
'programing' 카테고리의 다른 글
2바이트 어레이를 쉽게 연결하는 방법 (0) | 2022.07.02 |
---|---|
VueCli 3을 사용하여 index.html의 app.js 파일 이름을 변경하는 방법 (0) | 2022.07.02 |
Vue: .vue 템플릿에서 pug 언어가 인식되지 않았습니다. (0) | 2022.07.02 |
테일윈드 CSS에서 폭 전환은 어떻게 하나요? (0) | 2022.07.02 |
Vee-validate 3.0에서 URL을 검증하는 방법 (0) | 2022.07.02 |