CodeGym/Java Blog/무작위의/자바 String.split() 메소드
John Squirrels
레벨 41
San Francisco

자바 String.split() 메소드

무작위의 그룹에 게시되었습니다
회원
Java의 String.split 메서드 에 대해 이야기해 보겠습니다 . 이 메서드가 수행하는 작업과 필요한 이유입니다. 이것이 Java 문자열을 분할한다고 추측하는 것은 어렵지 않지만 이것이 실제로 어떻게 작동합니까? 방법의 작동에 대해 자세히 알아보고 명확하지 않은 세부 사항에 대해 논의해 보겠습니다. 동시에 String이 실제로 가지고 있는 분할 메소드의 수를 알아봅니다 . 갑시다!

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

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

    선언에는 "Java에서 split 메서드는 문자열을 하위 문자열로 분할합니다."라는 단어가 포함되어 있습니다. 메서드는 이러한 하위 문자열을 반환 값이 되는 배열로 수집합니다.

  2. 메서드에는 regex 라는 문자열 입력 매개 변수가 있습니다 .

    다시 말하지만 "정규식을 사용하여 정의된 구분 기호를 사용하여 문자열을 부분 문자열로 분할합니다."라는 설명을 기억하십시오. regex 입력 매개변수 원래 문자열에 적용되는 정규식입니다. 문자 또는 문자 조합이 일치하면 구분 기호로 처리됩니다.

Java의 String.split() 메서드: 문자열을 여러 부분으로 분할 - 1

실제로 Java의 분할

이제 요점에 더 가까이 갑시다. 일련의 단어가 있다고 상상해 봅시다. 예를 들면 다음과 같습니다.
나는 자바를 사랑
문자열을 단어로 분할해야 합니다. 이 문자열의 단어가 공백으로 서로 구분되어 있음을 알 수 있습니다. 이 경우 공백 문자는 구분 기호로 사용할 수 있는 완벽한 후보입니다. 작업을 해결하기 위한 코드는 다음과 같습니다.
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);
        }
    }
}
main 메서드 의 출력은 다음과 같습니다.
나는 자바를 사랑
split 메서드가 작동하는 방식에 대한 몇 가지 예를 더 살펴보겠습니다 .
구분자 방법의 결과
"나는 자바를 사랑한다" " " (공백 문자) { "나" , "사랑" , "자바" }
"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 클래스 에는 다음 서명이 있는 또 다른 split 메서드가 있습니다 .
String[] split(String regex, int limit)
이 메서드에는 추가 제한 매개 변수가 있습니다. 정규식 패턴이 원래 문자열에 적용될 횟수를 결정합니다 . 아래 설명을 참조하십시오.

한계 > 0

패턴은 -1회 제한 적용됩니다. 또한 반환된 배열의 길이는 limit 매개 변수의 값을 초과하지 않습니다. 배열의 마지막 요소는 구분 기호가 발견된 마지막 위치 다음에 오는 문자열의 일부입니다. 예:
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) {
        // Note the space at the end of the string
        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, ]

        Please note that the last element of the array is
        an empty string. This is caused by the whitespace
        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) {
        // Note the space at the end of the string
        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));
    }
}
split 메서드 의 매개변수 1개 버전 구현을 살펴보면 오버로드된 형제와 같지만 두 번째 인수가 0으로 설정되어 있음을 알 수 있습니다.
public String[] split(String regex) {
    return split(regex, 0);
}

다양한 예

실생활에서 특정 규칙에 따라 생성된 문자열이 있는 경우가 있습니다. 이러한 문자열은 어디에서나 프로그램에 들어올 수 있습니다.
  • 타사 서비스에서
  • 당사 서버로 전송된 요청에서
  • 구성 파일에서;
  • 등등.
이러한 상황에서 프로그래머는 일반적으로 "게임의 규칙"을 알고 있습니다. 프로그래머가 자신이 다음 패턴에 따라 저장된 사용자 정보를 다루고 있다는 것을 알고 있다고 가정해 보겠습니다.
user_id|사용자 로그인|사용자 이메일
몇 가지 특정 값을 예로 들어 보겠습니다.
135|벤더|bender@gmail.com
프로그래머의 작업이 사용자에게 이메일을 보내는 메서드를 작성하는 것이라고 가정합니다. 프로그래머는 위에 주어진 형식으로 기록된 사용자 데이터에 액세스할 수 있습니다. 이제 계속해서 분석할 하위 작업은 나머지 사용자 데이터에서 이메일 주소를 분리하는 방법입니다. 이것은 split 메소드가 유용할 수 있는 한 가지 예입니다. 결국 사용자 데이터 템플릿을 보면 나머지에서 사용자의 이메일 주소를 추출하는 것이 split 메서드를 호출하여 문자열 을 분할하는 것처럼 간단하다는 것을 알 수 있습니다. 그런 다음 이메일 주소는 결과 배열의 마지막 요소에 있습니다. 다음은 사용자 데이터가 포함된 문자열을 가져와서 사용자의 이메일 주소를 반환하는 메서드의 예입니다. 간단히 하기 위해 데이터 문자열이 항상 원하는 형식이라고 가정해 보겠습니다.
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,오이,2.39;2,토마토,1.89;3,베이컨,4.99
우리의 임무는 총 주문 비용을 계산하는 것입니다. 여기서 분할 방법을 여러 번 적용해야 합니다 . 첫 번째 단계는 ";"를 사용하여 문자열을 분할하는 것입니다. 구성 요소 부분으로 나누기 위해 구분 기호로 사용합니다. 그런 다음 각 결과 하위 문자열은 나중에 처리할 수 있는 별도의 제품에 대한 정보를 보유합니다. 그런 다음 각 제품에 대해 "," 기호를 사용하여 해당 정보를 분리합니다. 결과 문자열 배열에서 특정 인덱스(제품 가격이 저장되는 인덱스)가 있는 요소를 가져와 숫자 형식으로 변환하고 총 주문 비용을 합산합니다. 이 모든 계산을 수행하는 메서드를 작성해 보겠습니다.
public class Main {
    public static void main(String[] args) {
        String orderInfo = "1,cucumbers,2.39;2,tomatoes,1.89;3,bacon,4.99";
        System.out.println(getTotalOrderAmount(orderInfo));
        // Output: 9.27
    }

    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 클래스 의 split 메소드를 조사했습니다 . 특수 구분 기호를 사용하여 문자열을 구성 요소 부분으로 분할해야 할 때 필요한 것입니다. 이 메서드는 문자열 배열(원래 문자열을 구성하는 하위 문자열)을 반환합니다. 일치 항목이 구분 문자를 나타내는 정규식을 허용합니다. 이 방법의 다양한 미묘함을 조사했습니다.
  • 선행 구분 기호;
  • 두 개의 매개변수가 있는 오버로드된 형제입니다.
또한 분할 방법을 사용하여 가상이지만 매우 현실적인 문제를 해결하는 실제 상황을 모델링하려고 했습니다 .
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다