java - 패턴 - 자바 split length




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

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;
}

두 문자열로 나눌 문자열 "004-034556" 있습니다.

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

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


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("-");
    }
}

가장 적은 자원을 소비하는 가장 빠른 방법은 다음과 같습니다.

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 '-'
}

가정하면

  • 분할을 위해 정규식이 필요하지 않습니다.
  • 당신은 이미 당신의 앱에서 아파치 공유를 사용하고 있습니다.

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

A null input String returns null.

 StringUtils.split(null, *)         = null
 StringUtils.split("", *)           = []
 StringUtils.split("a.b.c", '.')    = ["a", "b", "c"]
 StringUtils.split("a..b.c", '.')   = ["a", "b", "c"]
 StringUtils.split("a:b:c", '.')    = ["a:b:c"]
 StringUtils.split("a b c", ' ')    = ["a", "b", "c"]

commong-lang을 사용하는 것이 좋습니다. 왜냐하면 일반적으로 많은 것들을 사용할 수 있기 때문입니다. 그러나, 당신이 분할을 수행하는 것 이외에 아무것도 필요하지 않으면 자신을 구현하거나 정규 표현식을 이스케이프하는 것이 더 좋은 선택입니다.


너도 이것처럼해볼 수있어.

 String concatenated_String="hi^Hello";

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

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

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

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

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

문서에서 :

public String[] split(String regex,int limit) 이 문자열을 주어진 정규식과 일치하도록 분할합니다 . 이 메서드에 의해 반환 된 배열에는이 표현식과 일치하거나 문자열의 끝으로 종료되는 다른 하위 문자열 로 종료되는이 문자열의 각 하위 문자열이 들어 있습니다. 배열의 부분 문자열은이 문자열에서 나오는 순서대로 있습니다. 표현식 입력의 어떤 부분과도 일치 하지 않으면 결과 배열에는 단 하나의 요소 , 즉이 문자열이 있습니다.

기본적으로 다음과 같이 할 수 있습니다.

String s = "123-456-789-123"; // The String to be split
String[] array = s.split("-"); // Split according to the hyphen and put them in an array
for(String subString : array){ // Cycle through the array
   System.out.println(subString);
}

산출:

123
456
789
123

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

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

산출:

004
034556

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

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는 하나의 십진수와 일치하고 +는 "하나 이상의 이전 표현식과 일치 함을 의미합니다.) -는 특별한 의미가 없으므로 입력 된 문자와 일치합니다. 역 슬래시를 두 번 이스케이프해야합니다. 이것을 자바 문자열로 쓸 때. 다른 몇 가지 예 :

([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

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

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

요약 : 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. Google 구아바 분배기 :

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

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

따라서 반환 유형 (배열, 목록 또는 반복 가능)과 같이 필요한 항목에 따라 최상의 옵션을 선택할 수 있습니다.

Here 은 이러한 메소드와 가장 일반적인 예제 (점, 슬래시, 물음표 등으로 분리하는 방법)에 대한 개요입니다.


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

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

적절한 메서드를 사용하면됩니다 : String#split() .

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

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

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

따라서, 예를 들어 마침표 / 점으로 분리하려는 경우 . split("\\.") 와 같은 개별 특수 문자를 이스케이프 처리하거나 문자 클래스 [] 를 사용하여 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을 접두사로 사용하여 긍정적 인 표정을 사용하십시오.

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

분할 문자가 오른쪽에 오도록하려면 패턴에 ?= group 접두사를 붙이면 긍정적 인 미리보기를 사용하십시오.

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

org.apache.commons.lang.StringUtils' split 메소드를 사용하면 분할하려는 문자 또는 문자열을 기준으로 문자열을 분할 할 수 있습니다.

메소드 서명 :

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

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

다음과 같이하면됩니다.

String str = "004-034556";

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

산출:

004
034556

문자열에 if가 없으면 주어진 문자열을 반환하고 아무런 예외도 발생하지 않는다고 가정합니다.


문자열 정규식을 사용하여 여러 문자로 분할

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 버전 사이의 일부 버전에 존재합니다.


 String string = "004^034556-34";
 String[] parts = string.split(Pattern.quote("^"));

특수 문자가 있으면 Patter.quote를 사용할 수 있습니다. 단순히 대시 (-)가 있으면 코드를 짧게 할 수 있습니다.

 String string = "004-34";
 String[] parts = string.split("-");

대시 (^) 대신 다른 특수 문자를 추가하려고하면 ArrayIndexOutOfBoundsException 이 발생합니다. 그 때문에 Pattern.quote 를 사용해야합니다.


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 ()을 사용할 수 있습니다.


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

string1=004 // sTemp[0];
string2=034556//sTemp[1];

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

이것은 당신의 끈을 두 부분으로 나눌 것입니다. 배열의 첫 번째 요소는 - 앞의 내용을 포함하는 부분이되고 배열의 두 번째 요소는 - 뒤에 나오는 문자열의 일부를 포함합니다.

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

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

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


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




string