sourcecode

Java에서 문자열을 분할하려면 어떻게 해야 합니까?

copyscript 2023. 5. 4. 20:26
반응형

Java에서 문자열을 분할하려면 어떻게 해야 합니까?

나는 줄을 나누고 싶습니다."004-034556" 기호 자 에 의 두 줄 로 해 으로 두 ."-":

part1 = "004";
part2 = "034556";

즉, 첫 번째 문자열에 이전 문자가 포함됩니다.'-'그리고 두 번째 문자열은 다음 문자를 포함합니다.'-'.

나는 또한 그 문자열이 다음을 가지고 있는지 확인하고 싶습니다.'-'그 안에

적절한 명명된 방법을 사용합니다.

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

:split의 인수는 정규식으로 간주되므로 필요한 경우 특수 문자를 이스케이프해야 합니다.

특별한 의미를 가진 12개의 문자가 있습니다: 백슬래시.\ 리인관^ 기호 러달기.$. 또는 기호 수직막또파이기프호는대기|? 또는 * 기호 러플스기.+ 번째 괄호( 괄호) 그고오닝스퀘어브래킷프리▁and브킷▁the▁bracket래.[시작 부분의 곱슬곱슬한 버팀대{이러한 특수 문자를 종종 "메타 문자"라고 합니다.

하려면, "/점에 분할"을 합니다..(즉, 정규식에서 "임의의 문자"를 의미함), 백슬래시를 사용하여 개별 특수 문자를 탈출합니다.split("\\.")또는 문자 클래스를 사용하여 문자를 표현합니다.split("[.]")아니면 그렇게 전체 끈을 탈출하기 위해 사용합니다.split(Pattern.quote(".")).

String[] parts = string.split(Pattern.quote(".")); // Split on the exact string.

문자열에 특정 문자가 포함되어 있는지 미리 테스트하려면 를 사용합니다.

if (string.contains("-")) {
    // Split it.
} else {
    throw new IllegalArgumentException("String " + string + " does not contain -");
}

정규식을 사용하지 않습니다.대신 사용합니다.

분할된 문자를 결과 부분에 유지하려면 긍정적인 둘러보기를 사용합니다.분할 문자가 왼쪽에 오도록 하려면 다음과 같이 접두사를 붙여 긍정적인 배경을 사용합니다.?<=도안에 모둠

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+)

괄호는 캡처 그룹을 나타냅니다. regexp의 해당 부분과 일치하는 문자열은 그림과 같이 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학생들

다음 항목:

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

Java 8의 경우:

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

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

org.apache.common.lang을 사용합니다.분할할 문자 또는 문자열을 기준으로 문자열을 분할할 수 있는 StringUtils의 분할 메서드입니다.

메서드 서명:

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

이 경우 "-"가 있을 때 문자열을 분할하려고 합니다.

다음과 같이 간단히 수행할 수 있습니다.

String str = "004-034556";

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

출력:

004
034556

만약에 에약만라고 합니다.-문자열에 없습니다. 지정된 문자열을 반환하므로 예외가 발생하지 않습니다.

그 요구 사항들은 해석의 여지를 남겼습니다.저는 방법을 쓰는 것을 추천합니다.

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]아니면 오류인가요?등등.

요약: Java에서 문자열을 분할하는 방법은 최소 5가지가 있습니다.

  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 Guava 스플리터:

     Iterable<String> result = Splitter.on(",").split("1,2,3,4");
    
  5. Apache Commons 문자열 유틸리티:

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

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

다음은 이러한 방법과 가장 일반적인 예(도트, 슬래시, 물음표 등으로 분할하는 방법)에 대한 큰 개요입니다.

이렇게도 해보세요.

 String concatenated_String="hi^Hello";

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

라고 가정하면,

  • 당신은 당신의 분열에 정규 표현이 필요하지 않습니다.
  • 당신은 당신의 앱에서 이미 아파치 커먼즈 랭을 사용하고 있습니다.

가장 쉬운 방법은 StringUtils#split(java.lang)을 사용하는 것입니다.문자열, 문자).정규 표현식이 필요 없는 경우 자바에서 제공하는 것보다 편리합니다.설명서에 나와 있듯이 다음과 같이 작동합니다.

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"]

보통은 쓸 수 있는 것들이 많이 들어있기 때문에 공용어를 사용하는 것을 추천합니다.하지만 분할하는 것 외에 다른 일에 필요하지 않다면 스스로 구현하거나 정규식을 피하는 것이 더 나은 선택입니다.

단순한 사용 사례의 경우 이 기능을 수행해야 합니다.guava를 사용하는 경우 다양한 문자열 작업의 체인을 허용하고 CharMatcher를 지원하는 스플리터 클래스도 있습니다.

Splitter.on('-')
       .trimResults()
       .omitEmptyStrings()
       .split(string);

리소스를 가장 적게 소비하는 가장 빠른 방법은 다음과 같습니다.

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

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

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.split을 사용하거나 성능에 관심이 없습니다.

경우 , 문없구거인기즉분정나호문특규단아자가문식일, 음중하아님가나경우닌)가 .$|()[{^?*+\그러면 사용할 수 있습니다.String.split.

String[] results = input.split(",");

분할 방법에는 델리미터가 단일 문자이고 위 목록에 없는 경우 정규식을 사용하지 않도록 하는 최적화 기능이 있습니다.그렇지 않으면 정규 표현식을 컴파일해야 하며 이는 이상적이지 않습니다.

복잡한 구분 기호를 사용하고 성능에 관심이 있는 경우 Pattern.split을 사용하여 패턴을 사전 컴파일합니다.

성능이 문제가 되고 구분 기호가 위에 없는 경우에는 정규식 패턴을 미리 컴파일하여 다시 사용할 수 있어야 합니다.

// Save this somewhere
Pattern pattern = Pattern.compile("[,;:]");

/// ... later
String[] results = pattern.split(input);

" 마막옵은여만새듭다니항을목전이히션지▁a다▁this.Matcher 을 극대화할 수 , 안전하지않습니다.또한 이 개체를 캐시하고 각 입력에 대해 재설정하여 성능을 극대화할 수 있지만, 이는 다소 복잡하며 스레드 안전하지 않습니다.

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

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

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

String textStr[] = yourString.split("-");
public class SplitTest {

    public static String[] split(String text, String delimiter) {
        java.util.List<String> parts = new java.util.ArrayList<String>();

        text += delimiter;

        for (int i = text.indexOf(delimiter), j=0; i != -1;) {
            String temp = text.substring(j,i);
            if(temp.trim().length() != 0) {
                parts.add(temp);
            }
            j = i + delimiter.length();
            i = text.indexOf(delimiter,j);
        }

        return parts.toArray(new String[0]);
    }


    public static void main(String[] args) {
        String str = "004-034556";
        String delimiter = "-";
        String result[] = split(str, delimiter);
        for(String s:result)
            System.out.println(s);
    }
}

StringTokenizer 클래스는 호환성을 위해 유지되는 레거시 클래스이므로 사용하지 마십시오. 새 코드에서는 사용할 수 없습니다.그리고 우리는 다른 사람들이 제안한 분할 방법도 활용할 수 있습니다.

String[] sampleTokens = "004-034556".split("-");
System.out.println(Arrays.toString(sampleTokens));

예상대로 인쇄됩니다.

[004, 034556]

이 답변에서 저는 또한 Java 8에서 방법에 대해 발생한 한 가지 변화를 지적하고 싶습니다.String#split() 메서드는 다음을 사용합니다.Pattern.split이제 결과 배열의 시작 부분에서 빈 문자열을 제거합니다.Java 8에 대한 설명서가 다음과 같이 변경되었습니다.

입력 시퀀스의 시작 부분에 양의 너비가 일치하면 결과 배열의 시작 부분에 빈 선행 부분 문자열이 포함됩니다.그러나 처음에 너비가 0인 일치는 이러한 빈 선행 하위 문자열을 생성하지 않습니다.

이는 다음 예를 의미합니다.

String[] sampleTokensAgain = "004".split("");
System.out.println(Arrays.toString(sampleTokensAgain));

는 세의 문자열을 얻을 입니다: 우는세 개끈얻 을것입다니:[0, 0, 4]자바 7과 그 이전의 경우처럼 4개가 아닙니다.와 유사한 질문도 확인하십시오.

한 가지 방법은 각 루프의 문자열을 실행하고 필요한 분할 문자를 사용하는 것입니다.

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

분할()을 사용할 수 있습니다.

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

여기 두 가지 방법이 있습니다.

WAY 1: 특수 문자로 두 숫자를 나누어야 하므로 정규식을 사용할 수 있습니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TrialClass
{
    public static void main(String[] args)
    {
        Pattern p = Pattern.compile("[0-9]+");
        Matcher m = p.matcher("004-034556");

        while(m.find())
        {
            System.out.println(m.group());
        }
    }
}

WAY 2: 문자열 분할 방법 사용

public class TrialClass
{
    public static void main(String[] args)
    {
        String temp = "004-034556";
        String [] arrString = temp.split("-");
        for(String splitString:arrString)
        {
            System.out.println(splitString);
        }
    }
}

StringTokenizer를 사용하면 구분 기호 유형에 관계없이 문자열을 두 개 이상의 부분으로 분할할 수 있습니다.

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

다음을 확인하십시오.split()의법에 있는 String자바독 수업.

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

String data = "004-034556-1212-232-232";
int cnt = 1;
for (String item : data.split("-")) {
        System.out.println("string "+cnt+" = "+item);
        cnt++;
}

여기 분할 문자열에 대한 많은 예가 있지만 코드 최적화는 거의 없습니다.

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

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

자바 내장 함수를 사용하는 대신 알고리즘을 작성하고 싶었습니다.

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

은 사용할 수 있습니다.split:

public class Demo {
    public static void main(String args[]) {
        String str = "004-034556";

        if ((str.contains("-"))) {
            String[] temp = str.split("-");
            for (String part:temp) {
                System.out.println(part);
            }
        }
        else {
            System.out.println(str + " does not contain \"-\".");
        }
    }
}

문자열을 분할하려면 String.split(regex)을 사용합니다.다음 예를 검토합니다.

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

산출량

004
034556

참고:

이 분할(정규식)은 정규식을 인수로 사용합니다.마침표/점과 같은 정규식 특수 문자는 이스케이프해야 합니다.

String s = "TnGeneral|DOMESTIC";
String a[]=s.split("\\|");
System.out.println(a.toString());
System.out.println(a[0]);
System.out.println(a[1]);

출력:

TnGeneral
DOMESTIC
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()입니다.다른 방법으로는 하위 문자열()을 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/3481828/how-do-i-split-a-string-in-java

반응형