etc./StackOverFlow

Java에서 문자열을 분할하는 방법

청렴결백한 만능 재주꾼 2022. 1. 2. 04:54
반응형

질문자 :riyana


두 개의 문자열로 분할하려는 문자열 "004-034556"

 string1="004"; string2="034556";

즉, 첫 번째 문자열에는 '-' '-' 뒤의 문자가 포함됩니다. '-' 가 있는지 확인하고 싶습니다. 그렇지 않은 경우 예외를 throw합니다. 어떻게 해야 하나요?



적절한 방법을 사용하십시오: String#split() .

 String string = "004-034556"; String[] parts = string.split("-"); String part1 = parts[0]; // 004 String part2 = parts[1]; // 034556

이것은 정규 표현식 을 사용하므로 필요한 경우 특수 문자 를 이스케이프 처리해야 합니다.

거기에 특별한 의미를 가진 12 개 문자입니다 : 백 슬래시는 \ , 캐럿 ^ , 달러 기호 $ , 기간 또는 점 . , 수직 막대 또는 파이프 기호 | , 물음표 ? , 별표 또는 별표 * , 더하기 기호 + , 여는 괄호 ( , 닫는 괄호 ) 및 여는 대괄호 [ , 여는 중괄호 { , 이러한 특수 문자는 종종 "메타 문자"라고 합니다.

따라서 예를 들어 마침표/점으로 분할하려는 경우 . 이는 정규식에서 "모든 문자 "를 의미하며 , 백슬래시 \ split("\\.") 와 같은 개별 특수 문자를 이스케이프하거나 문자 클래스 []split("[.]") , 또는 Pattern#quote() split(Pattern.quote(".")) 처럼 전체 문자열을 이스케이프합니다.

 String[] parts = string.split(Pattern.quote(".")); // Split on period.

문자열에 특정 문자가 포함되어 있는지 미리 테스트하려면 String#contains() .

 if (string.contains("-")) { // Split it. } else { throw new IllegalArgumentException("String " + string + " does not contain -"); }

이것은 정규 표현식을 사용하지 않습니다. 이를 위해 String#matches() 사용하십시오.

결과 부분에서 분할 문자를 유지하려면 긍정적인 둘러보기를 사용하십시오. 분할 문자가 왼쪽에 오도록 하려면 패턴에 ?<= group을 접두사로 붙여 긍정적인 lookbehind를 사용합니다.

 String string = "004-034556"; String[] parts = string.split("(?<=-)"); String part1 = parts[0]; // 004- String part2 = parts[1]; // 034556

분할 문자가 오른쪽에 오도록 하려면 패턴에 ?= group을 접두사로 붙여 긍정적인 lookahead를 사용합니다.

 String string = "004-034556"; String[] parts = string.split("(?=-)"); String part1 = parts[0]; // 004 String part2 = parts[1]; // -034556

split() 메서드의 두 번째 인수로 원하는 수를 제공할 수 있습니다.

 String string = "004-034556-42"; String[] parts = string.split("-", 2); String part1 = parts[0]; // 004 String part2 = parts[1]; // 034556-42

BalusC

문자열을 직접 처리하는 대신 캡처 그룹과 함께 정규식을 사용하는 것이 좋습니다. 이것은 입력에 대한 보다 정교한 제약을 암시하는 것을 간단하게 만든다는 이점이 있습니다. 예를 들어 다음은 문자열을 두 부분으로 나누고 둘 다 숫자로만 구성되도록 합니다.

 import java.util.regex.Pattern; import java.util.regex.Matcher; class SplitExample { private static Pattern twopart = Pattern.compile("(\\d+)-(\\d+)"); public static void checkString(String s) { Matcher m = twopart.matcher(s); if (m.matches()) { System.out.println(s + " matches; first part is " + m.group(1) + ", second part is " + m.group(2) + "."); } else { System.out.println(s + " does not match."); } } public static void main(String[] args) { checkString("123-4567"); checkString("foo-bar"); checkString("123-"); checkString("-4567"); checkString("123-4567-890"); } }

이 경우 패턴이 고정되어 있으므로 미리 컴파일하여 정적 멤버로 저장할 수 있습니다(예제에서는 클래스 로드 시 초기화됨). 정규식은 다음과 같습니다.

 (\d+)-(\d+)

괄호는 캡처링 그룹을 나타냅니다. 정규 표현식의 해당 부분과 일치하는 문자열은 표시된 대로 Match.group() 메서드에서 액세스할 수 있습니다. \d는 단일 십진수와 일치하고 +는 "이전 표현식 중 하나 이상과 일치함"을 의미합니다. -는 특별한 의미가 없으므로 입력에서 해당 문자와 일치합니다. 백슬래시를 이중 이스케이프해야 합니다. 이것을 Java 문자열로 작성할 때 몇 가지 다른 예:

 ([AZ]+)-([AZ]+) // Each part consists of only capital letters ([^-]+)-([^-]+) // Each part consists of characters other than - ([AZ]{2})-(\d+) // The first part is exactly two capital letters, // the second consists of digits

Rob Hague

사용하다:

 String[] result = yourString.split("-"); if (result.length != 2) throw new IllegalArgumentException("String not in correct format");

이렇게 하면 문자열이 두 부분으로 나뉩니다. 배열의 첫 번째 요소는 - 앞의 내용을 포함하는 부분이고, 배열의 두 번째 요소는 - 뒤의 문자열 부분을 포함합니다.

배열 길이가 2가 아니면 문자열이 string-string 형식이 아닙니다.

String 클래스 의 split() 메서드를 확인하십시오.


jjnguy

String[] out = string.split("-");

원하는 일을 해야 합니다. 문자열 클래스에는 문자열로 작동하는 많은 메서드가 있습니다.


secmask

// This leaves the regexes issue out of question // But we must remember that each character in the Delimiter String is treated // like a single delimiter public static String[] SplitUsingTokenizer(String subject, String delimiters) { StringTokenizer strTkn = new StringTokenizer(subject, delimiters); ArrayList<String> arrLis = new ArrayList<String>(subject.length()); while(strTkn.hasMoreTokens()) arrLis.add(strTkn.nextToken()); return arrLis.toArray(new String[0]); }

Mnyikka

자바 8:

 List<String> stringList = Pattern.compile("-") .splitAsStream("004-034556") .collect(Collectors.toList()); stringList.forEach(s -> System.out.println(s));

Somaiah Kumbera

요구 사항은 해석의 여지를 남겼습니다. 방법을 작성하는 것이 좋습니다.

 public final static String[] mySplit(final String s)

이 기능을 캡슐화합니다. 물론 구현에 대한 다른 답변에서 언급한 대로 String.split(..)을 사용할 수 있습니다.

입력 문자열과 원하는 결과 및 동작에 대한 몇 가지 단위 테스트를 작성해야 합니다.

좋은 시험 응시자는 다음을 포함해야 합니다.

 - "0022-3333" - "-" - "5555-" - "-333" - "3344-" - "--" - "" - "553535" - "333-333-33" - "222--222" - "222--" - "--4555"

적절한 테스트 결과를 정의하여 동작을 지정할 수 있습니다.

예를 들어 "-333" [,333] 반환되어야 하거나 오류인 경우입니다. "333-333-33"[333,333-33] or [333-333,33] 있나요? 아니면 오류인가요? 등등.


Michael Konietzka

당신은 또한 이것을 시도 할 수 있습니다

 String concatenated_String="hi^Hello"; String split_string_array[]=concatenated_String.split("\\^");

SHUNMUGA RAJ PRABAKARAN

가정하면,

  • 분할에 정규식이 필요하지 않습니다.
  • 당신은 이미 당신의 앱에서 apache commons lang을 사용하고 있습니다.

가장 쉬운 방법은 StringUtils#split(java.lang.String, char) 을 사용하는 것 입니다. 정규식이 필요하지 않은 경우 Java에서 제공하는 것보다 더 편리합니다. 매뉴얼에 따르면 다음과 같이 작동합니다.

 A null input String returns null. StringUtils.split(null, *) = null StringUtils.split("", *) = [] StringUtils.split("abc", '.') = ["a", "b", "c"] StringUtils.split("a..bc", '.') = ["a", "b", "c"] StringUtils.split("a:b:c", '.') = ["a:b:c"] StringUtils.split("abc", ' ') = ["a", "b", "c"]

나는 commong-lang을 사용하는 것이 좋습니다. 일반적으로 사용할 수 있는 것들이 많이 포함되어 있기 때문입니다. 그러나 분할을 수행하는 것 외에 다른 용도로 필요하지 않은 경우 직접 구현하거나 정규식을 이스케이프하는 것이 더 나은 옵션입니다.


eis

분할하려는 문자 또는 문자열을 기반으로 문자열을 분할할 수 있는 org.apache.commons.lang.StringUtils의 분할 메소드를 사용하십시오.

메서드 서명:

 public static String[] split(String str, char separatorChar);

귀하의 경우 "-"가 있을 때 문자열을 분할하고 싶습니다.

다음과 같이 간단히 할 수 있습니다.

 String str = "004-034556"; String split[] = StringUtils.split(str,"-");

산출:

 004 034556

- 가 없으면 지정된 문자열을 반환하고 예외가 발생하지 않는다고 가정합니다.


sandeep vanama

요약하자면: Java에서 문자열을 분할하는 방법에는 최소한 다섯 가지가 있습니다.

  1. String.split():

     String[] parts ="10,20".split(",");
  2. Pattern.compile(regexp).splitAsStream(입력):

     List<String> strings = Pattern.compile("\\|") .splitAsStream("010|020202") .collect(Collectors.toList());
  3. StringTokenizer(레거시 클래스):

     StringTokenizer strings = new StringTokenizer("Welcome to EXPLAINJAVA.COM!", "."); while(strings.hasMoreTokens()){ String substring = strings.nextToken(); System.out.println(substring); }
  4. 구글 구아바 스플리터:

     Iterable<String> result = Splitter.on(",").split("1,2,3,4");
  5. Apache Commons StringUtils:

     String[] strings = StringUtils.split("1,2,3,4", ",");

따라서 필요한 항목(예: 반환 유형(배열, 목록 또는 반복 가능))에 따라 가장 적합한 옵션을 선택할 수 있습니다.

다음 은 이러한 방법과 가장 일반적인 예(점, 슬래시, 물음표 등으로 분할하는 방법)에 대한 큰 개요입니다.


Dmytro Shvechikov

가장 적은 리소스를 소비하는 가장 빠른 방법은 다음과 같습니다.

 String s = "abc-def"; int p = s.indexOf('-'); if (p >= 0) { String left = s.substring(0, p); String right = s.substring(p + 1); } else { // s does not contain '-' }

David

간단한 사용 사례의 경우 String.split() 이 작업을 수행해야 합니다. 구아바를 사용하는 경우 다른 문자열 작업의 연결을 허용하고 CharMatcher를 지원하는 Splitter 클래스도 있습니다.

 Splitter.on('-') .trimResults() .omitEmptyStrings() .split(string);

Vitalii Fedorenko

Regex를 사용하여 여러 문자로 문자열 분할

 public class StringSplitTest { public static void main(String args[]) { String s = " ;String; String; String; String, String; String;;String;String; String; String; ;String;String;String;String"; //String[] strs = s.split("[,\\s\\;]"); String[] strs = s.split("[,\\;]"); System.out.println("Substrings length:"+strs.length); for (int i=0; i < strs.length; i++) { System.out.println("Str["+i+"]:"+strs[i]); } } }

산출:

 Substrings length:17 Str[0]: Str[1]:String Str[2]: String Str[3]: String Str[4]: String Str[5]: String Str[6]: String Str[7]: Str[8]:String Str[9]:String Str[10]: String Str[11]: String Str[12]: Str[13]:String Str[14]:String Str[15]:String Str[16]:String

그러나 모든 JDK 버전에서 동일한 출력을 기대하지 마십시오. 첫 번째 null 문자열이 무시된 일부 JDK 버전에 존재하는 한 가지 버그 를 보았습니다. 이 버그는 최신 JDK 버전에는 없지만 JDK 1.7 후기 버전과 1.8 초기 버전 사이의 일부 버전에는 존재합니다.


Ravindra babu

public class SplitTest { public static String[] split(String text, String delimiter) { java.util.List<String> parts = new java.util.ArrayList<String>(); text += delimiter; for (int i = text.indexOf(delimiter), j=0; i != -1;) { String temp = text.substring(j,i); if(temp.trim().length() != 0) { parts.add(temp); } j = i + delimiter.length(); i = text.indexOf(delimiter,j); } return parts.toArray(new String[0]); } public static void main(String[] args) { String str = "004-034556"; String delimiter = "-"; String result[] = split(str, delimiter); for(String s:result) System.out.println(s); } }

Akhilesh Dhar Dubey

다음 문을 사용하여 줄 바꿈으로 문자열을 분할할 수 있습니다.

 String textStr[] = yourString.split("\\r?\\n");

다음 문을 사용하여 하이픈/문자로 문자열을 분할할 수 있습니다.

 String textStr[] = yourString.split("-");

RajeshVijayakumar

실제로 고려해야 할 두 가지 방법이 있습니다.

한 문자 구분 기호에 String.split을 사용하거나 성능에 신경 쓰지 않습니다.

성능이 문제가 되지 않거나 구분 기호가 정규식 특수 문자가 아닌 단일 문자인 경우(즉, .$|()[{^?*+\ String.split 을 사용할 수 있습니다.

 String[] results = input.split(",");

split 메서드는 구분 기호가 단일 문자이고 위 목록에 없는 경우 정규식 사용을 피하기 위해 최적화되어 있습니다. 그렇지 않으면 정규식을 컴파일해야 하며 이는 이상적이지 않습니다.

복잡한 구분 기호를 사용하고 성능이 중요하다면 Pattern.split을 사용하고 패턴을 미리 컴파일하십시오.

성능이 문제이고 구분 기호가 위의 것이 아닌 경우 재사용할 수 있는 정규식 패턴을 미리 컴파일해야 합니다.

 // Save this somewhere Pattern pattern = Pattern.compile("[,;:]"); /// ... later String[] results = pattern.split(input);

이 마지막 옵션은 여전히 새 Matcher 개체를 만듭니다. 최대 성능을 위해 이 개체를 캐시하고 각 입력에 대해 재설정할 수도 있지만 이는 다소 복잡하고 스레드로부터 안전하지 않습니다.


rghome

import java.io.*; public class BreakString { public static void main(String args[]) { String string = "004-034556-1234-2341"; String[] parts = string.split("-"); for(int i=0;i<parts.length;i++) { System.out.println(parts[i]); } } }

Ravi Pandey

이를 수행하는 한 가지 방법은 for-each 루프에서 문자열을 실행하고 필요한 분할 문자를 사용하는 것입니다.

 public class StringSplitTest { public static void main(String[] arg){ String str = "004-034556"; String split[] = str.split("-"); System.out.println("The split parts of the String are"); for(String s:split) System.out.println(s); } }

산출:

 The split parts of the String are: 004 034556

Keshav Pradeep Ramanath

StringTokenizer 클래스는 호환성을 위해 유지되는 레거시 클래스이므로 새 코드에서는 사용하지 않는 것이 좋습니다. 그리고 우리는 다른 사람들이 제안한 split 방법도 사용할 수 있습니다.

 String[] sampleTokens = "004-034556".split("-"); System.out.println(Arrays.toString(sampleTokens));

예상대로 다음과 같이 인쇄됩니다.

 [004, 034556]

이 답변에서 Java 8의 split 메서드에 대해 발생한 한 가지 변경 사항도 지적하고 싶습니다. String#split() 메서드는 Pattern.split 을 사용하며 이제 결과 배열의 시작 부분에서 빈 문자열을 제거합니다. Java 8 문서에서 이 변경 사항을 확인하십시오.

입력 시퀀스의 시작 부분에 양수 너비 일치가 있는 경우 결과 배열의 시작 부분에 빈 선행 부분 문자열이 포함됩니다. 그러나 시작 부분에서 너비가 0인 일치는 이러한 빈 선행 부분 문자열을 생성하지 않습니다.

다음 예를 의미합니다.

 String[] sampleTokensAgain = "004".split(""); System.out.println(Arrays.toString(sampleTokensAgain));

Java 7 이전의 경우처럼 4개가 아니라 [0, 0, 4] 세 개의 문자열을 얻게 됩니다. 또한 이 유사한 질문을 확인하십시오.


akhil_mittal

Split()을 사용할 수 있습니다.

 import java.io.*; public class Splitting { public static void main(String args[]) { String Str = new String("004-034556"); String[] SplittoArray = Str.split("-"); String string1 = SplittoArray[0]; String string2 = SplittoArray[1]; } }

그렇지 않으면 StringTokenizer를 사용할 수 있습니다.

 import java.util.*; public class Splitting { public static void main(String[] args) { StringTokenizer Str = new StringTokenizer("004-034556"); String string1 = Str.nextToken("-"); String string2 = Str.nextToken("-"); } }

Sarat Chandra

여기에 두 가지 방법이 있습니다.

방법 1: 두 개의 숫자를 특수 문자로 분할해야 하므로 정규식을 사용할 수 있습니다.

 import java.util.regex.Matcher; import java.util.regex.Pattern; public class TrialClass { public static void main(String[] args) { Pattern p = Pattern.compile("[0-9]+"); Matcher m = p.matcher("004-034556"); while(m.find()) { System.out.println(m.group()); } } }

방법 2: 문자열 분할 방법 사용

 public class TrialClass { public static void main(String[] args) { String temp = "004-034556"; String [] arrString = temp.split("-"); for(String splitString:arrString) { System.out.println(splitString); } } }

Akshay Gaikwad

구분 기호 유형이 있는지 여부에 관계없이 StringTokenizer를 사용하여 문자열을 둘 이상의 부분으로 분할할 수 있습니다.

 StringTokenizer st = new StringTokenizer("004-034556", "-"); while(st.hasMoreTokens()) { System.out.println(st.nextToken()); }

Rohit-Pandey

javadoc String split() 메소드를 확인하십시오.

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

 String data = "004-034556-1212-232-232"; int cnt = 1; for (String item : data.split("-")) { System.out.println("string "+cnt+" = "+item); cnt++; }

여기에 분할 문자열에 대한 많은 예가 있지만 최적화된 코드는 거의 없습니다.


Divyesh Kanzariya

String str="004-034556" String[] sTemp=str.split("-");// '-' is a delimiter string1=004 // sTemp[0]; string2=034556//sTemp[1];

Shivanandam

Java 내장 함수를 사용하는 대신 알고리즘을 작성하고 싶었습니다.

 public static List<String> split(String str, char c){ List<String> list = new ArrayList<>(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++){ if(str.charAt(i) != c){ sb.append(str.charAt(i)); } else{ if(sb.length() > 0){ list.add(sb.toString()); sb = new StringBuilder(); } } } if(sb.length() >0){ list.add(sb.toString()); } return list; }

None

split 메소드를 사용할 수 있습니다.

 public class Demo { public static void main(String args[]) { String str = "004-034556"; if ((str.contains("-"))) { String[] temp = str.split("-"); for (String part:temp) { System.out.println(part); } } else { System.out.println(str + " does not contain \"-\"."); } } }

Jamith NImantha

문자열을 분할하려면 String.split(regex)를 사용합니다. 다음 예를 검토하십시오.

 String data = "004-034556"; String[] output = data.split("-"); System.out.println(output[0]); System.out.println(output[1]);

산출

 004 034556

메모:

이 분할(정규식)은 정규식을 인수로 사용합니다. 마침표/점과 같은 정규식 특수 문자를 이스케이프 처리해야 합니다.


KIBOU Hassan

String s="004-034556"; for(int i=0;i<s.length();i++) { if(s.charAt(i)=='-') { System.out.println(s.substring(0,i)); System.out.println(s.substring(i+1)); } }

모두가 언급했듯이 split()은 귀하의 경우에 사용할 수 있는 최상의 옵션입니다. 대체 방법은 substring()을 사용할 수 있습니다.


SAM Jr

문자열을 분할하려면 String.split(regex) .

 String phone = "004-034556"; String[] output = phone.split("-"); System.out.println(output[0]); System.out.println(output[1]);

산출:

 004 034556

KIBOU Hassan

출처 : http:www.stackoverflow.com/questions/3481828/how-to-split-a-string-in-java

반응형