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

나는 문자열을 가지고 "004-034556"나는 두 개의 문자열로 분할 할 것을 :

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

즉, 첫 번째 문자열에는 이전 문자가 포함 '-'되고 두 번째 문자열에는 이후 문자가 포함됩니다 '-'. 또한 문자열에 포함되어 있는지 확인하고 싶습니다 '-'. 그렇지 않다면 예외를 던질 것입니다. 어떻게해야합니까?



답변

적절한 방법을 사용하십시오 : 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()대신 사용하십시오.

결과 부분에 분할 문자를 유지하려면 긍정적 인 둘러보기를 사용 하십시오 . 분할 문자를 왼쪽으로 끝내 ?<=려면 패턴에서 접두사 그룹을 지정하여 긍정적 인 lookbehind를 사용 하십시오.

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

분할 문자를 오른쪽으로 끝내 ?=려면 패턴에 그룹 접두사를 지정하여 긍정적 인 미리보기를 사용 하십시오.

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


답변

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

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는 10 진수와 일치하며, +는 “이전 식의 하나 이상 일치”를 의미합니다.-특별한 의미가 없으므로 입력에서 해당 문자와 ​​일치합니다. 백 슬래시를 두 번 이스케이프해야합니다. 이것을 Java 문자열로 쓸 때 다른 몇 가지 예 :

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


답변

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

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

배열 길이가 2가 아닌 경우 문자열은 형식이 아닙니다 string-string.

수업 에서 split()방법을 확인하십시오 String.

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-int-


답변

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

당신이 원하는 일을해야합니다. 문자열 클래스에는 문자열로 작동하는 많은 방법이 있습니다.


답변

// 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]);
}


답변

자바 8 :

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

    stringList.forEach(s -> System.out.println(s));


답변

요구 사항은 해석의 여지가되었습니다. 방법을 쓰는 것이 좋습니다.

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]아니면 오류입니까? 등등.