[java] Java에서 문자열을 동일한 길이의 하위 문자열로 분할

"Thequickbrownfoxjumps"Java에서 문자열을 동일한 크기의 하위 문자열로 분할하는 방법 예 : "Thequickbrownfoxjumps"크기가 4와 같으면 출력해야합니다.

["Theq","uick","brow","nfox","jump","s"]

비슷한 질문 :

스칼라에서 문자열을 같은 길이의 하위 문자열로 분할



답변

다음은 정규식 한 줄짜리 버전입니다.

System.out.println(Arrays.toString(
    "Thequickbrownfoxjumps".split("(?<=\\G.{4})")
));

\G이전 일치가 종료 된 위치와 일치하는 너비가 0 인 어설 션입니다. 이 경우 없었다 에는 이전의 일치, 그것은 입력의 시작, 같은 일치 \A. 둘러싼 lookbehind는 마지막 일치의 끝에서 네 문자 인 위치와 일치합니다.

Lookbehind와 \G고급 정규식 기능은 모든 맛에서 지원되는 것은 아닙니다. 또한 \G이를 지원하는 여러 가지 특성에 일관되게 구현되지 않습니다. 이 트릭은 Java , Perl, .NET 및 JGSoft에서 작동하지만 PHP (PCRE), Ruby 1.9+ 또는 TextMate (Oniguruma 모두)에서는 작동 하지 않습니다 . JavaScript /y(sticky flag)는만큼 유연 \G하지 않으며 JS가 lookbehind를 지원하더라도 이러한 방식으로 사용할 수 없습니다.

다른 옵션이있는 경우 반드시이 솔루션을 권장 하지는 않습니다 . 다른 답변의 비정규 솔루션은 더 길 수 있지만 자체 문서화도 가능합니다. 이것은 그것 의 반대 입니다. 😉

또한 Android에서 작동하지 않으므로 \Glookbehinds에서 의 사용을 지원하지 않습니다 .


답변

간단한 산술 및 문자열 연산 으로이 작업을 수행하는 것이 매우 쉽습니다.

public static List<String> splitEqually(String text, int size) {
    // Give the list the right capacity to start with. You could use an array
    // instead if you wanted.
    List<String> ret = new ArrayList<String>((text.length() + size - 1) / size);

    for (int start = 0; start < text.length(); start += size) {
        ret.add(text.substring(start, Math.min(text.length(), start + size)));
    }
    return ret;
}

나는 이것을 위해 정규 표현식을 사용할 가치가 있다고 생각하지 않습니다.

편집 : 정규식을 사용하지 않는 이유 :

  • 이것은 정규식의 실제 패턴 일치를 사용하지 않습니다. 방금 계산 중입니다.
  • 대부분의 경우 중요하지 않지만 위의 내용이 더 효율적 이라고 생각 합니다.
  • 다른 장소에서 가변 크기를 사용해야하는 경우 매개 변수 -ick를 기반으로 정규 표현식 자체를 작성하는 반복 또는 도우미 함수가 있습니다.
  • 다른 답변으로 제공된 정규 표현식은 먼저 컴파일되지 않았으며 (잘못된 이스케이프 처리) 작동하지 않았습니다. 내 코드는 처음으로 작동했습니다. 그것은 정규 코드와 일반 코드 IMO의 유용성에 대한 증거입니다.

답변

Google Guava를 사용하면 매우 쉽습니다 .

for(final String token :
    Splitter
        .fixedLength(4)
        .split("Thequickbrownfoxjumps")){
    System.out.println(token);
}

산출:

Theq
uick
brow
nfox
jump
s

또는 배열로 결과가 필요한 경우 다음 코드를 사용할 수 있습니다.

String[] tokens =
    Iterables.toArray(
        Splitter
            .fixedLength(4)
            .split("Thequickbrownfoxjumps"),
        String.class
    );

참고:

참고 : 스플리터 구성은 위에 인라인으로 표시되어 있지만 스플리터는 변경할 수없고 재사용 할 수 있으므로 상수로 저장하는 것이 좋습니다.

private static final Splitter FOUR_LETTERS = Splitter.fixedLength(4);

// more code

for(final String token : FOUR_LETTERS.split("Thequickbrownfoxjumps")){
    System.out.println(token);
}


답변

구글의 구아바 범용 라이브러리를 사용하고 있다면 (그리고 솔직히 새로운 자바 프로젝트 라면 아마 ) Splitter 클래스를 사용하는 것은 그리 쉬운 일이 아닙니다 :

for (String substring : Splitter.fixedLength(4).split(inputString)) {
    doSomethingWith(substring);
}

그게 다야 . 쉽게!


답변

public static String[] split(String src, int len) {
    String[] result = new String[(int)Math.ceil((double)src.length()/(double)len)];
    for (int i=0; i<result.length; i++)
        result[i] = src.substring(i*len, Math.min(src.length(), (i+1)*len));
    return result;
}


답변

public String[] splitInParts(String s, int partLength)
{
    int len = s.length();

    // Number of parts
    int nparts = (len + partLength - 1) / partLength;
    String parts[] = new String[nparts];

    // Break into parts
    int offset= 0;
    int i = 0;
    while (i < nparts)
    {
        parts[i] = s.substring(offset, Math.min(offset + partLength, len));
        offset += partLength;
        i++;
    }

    return parts;
}


답변

(예외 처리) 또는 Apache lang commons ( 예외 처리) substring에서 사용할 수 있습니다.String.class

static String   substring(String str, int start, int end) 

루프 안에 넣으면 갈 수 있습니다.