JavaRush /Java Blog /Random-KO /Java의 분할 방법: 문자열을 여러 부분으로 나눕니다.

Java의 분할 방법: 문자열을 여러 부분으로 나눕니다.

Random-KO 그룹에 게시되었습니다
문자열 분할 방법 에 대해 이야기해 보겠습니다 . 이 방법이 수행하는 작업과 필요한 이유입니다. 문자열을 나누는 것이라고 추측하기 쉽지만 실제로는 어떻게 작동합니까? 메서드가 어떻게 작동하는지 자세히 살펴보고 몇 가지 명확하지 않은 세부 사항에 대해 논의하는 동시에 String 클래스 에 실제로 몇 개의 분할 메서드가 있는지 알아보겠습니다. 갑시다!

Java String.split에 대한 정의 및 서명

Java의 분할 메소드는 정규식을 사용하여 지정된 구분 기호를 사용하여 문자열을 하위 문자열로 분할합니다. 메소드 서명을 제공하고 다이빙을 시작하겠습니다.
String[] split(String regex)
서명에서 두 가지가 분명해졌습니다.
  1. 이 메서드는 문자열 배열을 반환합니다.
  2. 이 메서드는 정규식 문자열을 매개 변수로 사용합니다.
위에 주어진 정의의 관점에서 각 항목을 개별적으로 살펴보겠습니다.
  1. 이 메서드는 문자열 배열을 반환합니다.

    정의에는 " Java의 분할 메소드는 문자열을 하위 문자열로 분할합니다."라는 단어가 포함되어 있습니다. 이러한 하위 문자열은 메서드에 의해 배열로 수집되고 해당 반환 값을 나타냅니다.

  2. 이 메서드는 정규식 문자열을 매개 변수로 사용합니다.

    다시 한번 정의를 기억하세요. "정규식을 사용하여 지정된 구분 기호를 사용하여 문자열을 하위 문자열로 분할합니다." 허용되는 regex 매개변수 는 소스 문자열에 적용되고 소스 문자열의 구분 기호 문자(또는 문자 조합)와 일치하는 정규식 패턴입니다.

Java의 분할 방법: 문자열을 여러 부분으로 나눕니다 - 1

실제로 분할

이제 사업을 시작하겠습니다. 단어가 포함된 문자열이 있다고 상상해 봅시다. 예를 들어 다음과 같습니다.
나는 자바를 좋아한다
문자열을 단어로 나누어야 합니다. 이 줄에서는 단어가 공백으로 서로 구분되어 있음을 알 수 있습니다. 이 경우 공간은 구분자 역할에 이상적인 후보입니다. 이 문제를 해결하기 위한 코드는 다음과 같습니다.
public class Main {
    public static void main(String[] args) {
        String str = "I love Java";
        String[] words = str.split(" ");
        for (String word : words) {
            System.out.println(word);
        }
    }
}
기본 메서드 의 출력은 다음 줄입니다.
나는 자바를 좋아한다
분할 방법이 어떻게 작동하는지에 대한 몇 가지 예를 더 살펴보겠습니다 .
구분 기호 방법의 결과
"나는 자바를 좋아해요" " " (공백 문자) { "나" , "사랑" , "자바" }
"192.168.0.1:8080" ":" { "192.168.0.1" , "8080" }
"빨강, 주황, 노랑" "," { "빨간색" , "주황색" , "노란색" }
"빨강, 주황, 노랑" ", " { "빨간색" , "주황색" , "노란색" }
위 표의 마지막 두 행 간의 차이점을 확인하세요. 두 번째 줄에서 구분 기호는 쉼표이므로 일부 단어 앞에 공백이 있는 방식으로 줄이 분할됩니다. 마지막 줄에서는 쉼표와 공백 문자를 구분 기호로 사용했습니다. 따라서 결과 배열에는 선행 공백이 있는 줄이 포함되지 않았습니다. 이는 올바른 구분 기호를 신중하게 선택하는 것이 얼마나 중요한지 보여주는 작은 세부 사항일 뿐입니다.

선행 구분 기호

또 하나의 중요한 뉘앙스가 있습니다. 소스 문자열이 구분 기호로 시작하는 경우 결과 배열의 첫 번째 요소는 빈 문자열이 됩니다. 예를 들어 다음과 같습니다. 소스 문자열: "I love Java" 구분 기호: " " 결과 배열: { "" , "I" , "love" , "Java" } 그러나 소스 문자열이 구분 기호로 끝나는 경우 시작하지 않으면 결과가 달라집니다. 소스 문자열: "I love Java" 구분 기호: " " 결과 배열: { "I" , "love" , "Java" } 코드에서 분할 메소드의 변형을 살펴봅니다. 소스 문자열의 끝 및/또는 시작 부분에 구분 문자가 있는 경우:
public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" "));
        print(" I love Java".split(" "));
        print("I love Java ".split(" "));
        print(" I love Java ".split(" "));
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
기본 메소드 의 출력은 다음과 같습니다.
[나, 사랑, 자바] [, 나, 사랑, 자바] [나, 사랑, 자바] [, 나, 사랑, 자바]
소스 문자열의 첫 번째 문자가 구분 기호 문자인 경우 결과 배열의 첫 번째 요소는 빈 문자열입니다.

과부하된 동료

String 클래스에는 다음 서명이 포함된 또 다른 분할 메서드 가 있습니다 .
String[] split(String regex, int limit)
이 메소드에는 추가 제한 매개변수가 있습니다. 이는 정규식 패턴이 소스 문자열에 적용될 횟수를 결정합니다 . 다음은 설명입니다:

한도 > 0

-1회 제한이 적용됩니다 . 이 경우 배열의 길이는 제한값 초과하지 않습니다 . 배열의 마지막 요소는 발견된 마지막 구분 기호 뒤의 문자열 부분이 됩니다. 예:
public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" ", 1));
        print("I love Java".split(" ", 2));
        /*
         Output:
         [I love Java]
         [I, love Java]
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

한도 < 0

구분 기호 검색 패턴은 가능한 한 여러 번 문자열에 적용됩니다. 결과 배열의 길이는 임의일 수 있습니다. 예:
public class Main {
    public static void main(String[] args) {
        // Notice the space at the end of the line
        print("I love Java ".split(" ", -1));
        print("I love Java ".split(" ", -2));
        print("I love Java ".split(" ", -12));
        /*
         Output:
        [I, love, Java, ]
        [I, love, Java, ]
        [I, love, Java, ]

        Note that the last element of the array is
        an empty string, resulting from the space
        at the end of the original string.
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

한도 0

Limit < 0 인 경우와 마찬가지로 구분 기호 패턴은 가능한 한 여러 번 문자열에 적용됩니다. 결과 배열의 길이는 제한되지 않습니다. 마지막 요소가 빈 문자열과 같으면 최종 배열에서 삭제됩니다. 예:
public class Main {
    public static void main(String[] args) {
        // Notice the space at the end of the line
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        /*
         Output:
        [I, love, Java]
        [I, love, Java]
        [I, love, Java]
        Note the absence of empty strings at the end of the arrays
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
인수가 하나인 분할 메소드 의 구현을 살펴보면 이 메소드가 두 번째 인수 0을 사용하여 오버로드된 형제를 호출하는 것을 볼 수 있습니다.
public String[] split(String regex) {
    return split(regex, 0);
}

다양한 사례

실무에서 특정 규칙에 따라 라인을 컴파일하는 경우가 가끔 발생합니다. 이 줄은 어디에서나 우리 프로그램에 "들어올" 수 있습니다.
  • 제3자 서비스에서;
  • 요청에서 당사 서버로
  • 구성 파일에서;
  • 등.
일반적으로 이러한 상황에서 프로그래머는 "게임의 규칙"을 알고 있습니다. 프로그래머가 다음 패턴에 따라 저장된 사용자에 대한 정보를 가지고 있다는 것을 알고 있다고 가정해 보겠습니다.
user_id|user_login|user_email
예를 들어 특정 값을 살펴보겠습니다.
135|벤더|bender@gmail.com
이제 프로그래머는 사용자에게 이메일을 보내는 메서드를 작성해야 하는 과제에 직면하게 되었습니다. 위의 형식으로 기록된 사용자에 관한 정보를 마음대로 사용할 수 있습니다. 음, 우리가 계속해서 분석할 하위 작업은 사용자에 대한 일반 정보에서 이메일 주소를 분리하는 것입니다. 이는 분할 방법이 유용할 수 있는 한 가지 예입니다. 결국 템플릿을 보면 모든 정보에서 사용자의 이메일 주소를 추출하려면 분할 방법 을 사용하여 줄을 분할하기만 하면 된다는 것을 이해합니다 . 그러면 이메일 주소는 결과 배열의 마지막 요소에 포함됩니다. 사용자에 대한 정보가 포함된 문자열을 가져와 사용자의 이메일을 반환하는 메서드의 예를 들어 보겠습니다. 단순화하기 위해 이 문자열이 항상 필요한 형식과 일치한다고 가정해 보겠습니다.
public class Main {
    public static void main(String[] args) {
        String userInfo = "135|bender|bender@gmail.com";
        System.out.println(getUserEmail(userInfo));
        // Output: bender@gmail.com
    }

    static String getUserEmail(String userInfo) {
        String[] data = userInfo.split("\\|");
        return data[2]; // or data[data.length - 1]
    }
}
구분 기호에 유의하세요: "\\|" . 정규 표현식에서는 “|” - 이것은 특정 논리가 연결된 특수 문자입니다. 이를 일반 문자(소스 문자열에서 찾으려는 문자)로 사용하려면 두 개의 백슬래시를 사용하여 이 문자를 이스케이프해야 합니다. 또 다른 예를 살펴보겠습니다. 대략 다음 형식으로 작성된 주문에 대한 정보가 있다고 가정해 보겠습니다.
item_number_1,item_name_1,item_price_1;item_number_2,item_name_2,item_price_2;...;item_number_n,item_name_n,item_price_n
아니면 특정 값을 취해보자:
1, 오이, 20.05, 2, 토마토, 123.45, 3, 산토끼, 0.50
우리는 주문의 총 비용을 계산하는 작업에 직면해 있습니다. 여기서는 분할 방법을 여러 번 사용해야 합니다 . 첫 번째 단계는 ";" 기호를 통해 문자열을 구성 요소 부분으로 분할하는 것입니다. 그런 다음 각 부분에는 향후 처리할 수 있는 개별 제품에 대한 정보가 포함됩니다. 그런 다음 각 제품 내에서 "," 기호를 사용하여 정보를 분리하고 결과 배열에서 특정 인덱스(가격이 저장됨)가 있는 요소를 가져와 숫자 형식으로 변환하고 최종 비용을 계산합니다. 주문의. 이 모든 것을 계산하는 메서드를 작성해 보겠습니다.
public class Main {
    public static void main(String[] args) {
        String orderInfo = "1, cucumbers, 20.05; 2, tomatoes, 123.45; 3, hares, 0.50";
        System.out.println(getTotalOrderAmount(orderInfo));
        // Output: 144.0
    }

    static double getTotalOrderAmount(String orderInfo) {
        double totalAmount = 0d;
        final String[] items = orderInfo.split(";");

        for (String item : items) {
            final String[] itemInfo = item.split(",");
            totalAmount += Double.parseDouble(itemInfo[2]);
        }

        return totalAmount;
    }
}
이 방법이 어떻게 작동하는지 스스로 알아내십시오. 이러한 예를 바탕으로, 문자열 형식의 일부 정보가 있고, 이로부터 좀 더 구체적인 정보를 추출해야 할 때 분할 방법이 사용된다고 말할 수 있습니다.

결과

String 클래스 의 분할 메소드를 살펴보았습니다 . 특수 구분 기호를 사용하여 문자열을 구성 요소 부분으로 분할해야 합니다. 이 메서드는 문자열 배열(문자열의 구성 요소)을 반환합니다. 구분 기호 문자를 찾는 정규식을 허용합니다. 우리는 이 방법의 다양한 세부 사항을 살펴보았습니다.
  • 선행 구분 기호 문자;
  • 두 가지 논쟁으로 인해 과부하가 걸린 형제.
또한 비록 허구적이지만 매우 현실적인 문제를 해결하기 위해 분할 방법을 사용하는 일부 "실제" 상황을 시뮬레이션하려고 했습니다 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION