C #에서 문자열을 다른 문자열로 나누기


682

Split()문자열을 분할 하는 방법을 사용 했지만 문자열을 문자로 분할하는 경우에만 작동하는 것으로 보입니다. string매개 변수로 분할 된 다른 문자열 로을 분할하는 방법이 있습니까?

스플리터를 문자 배열로 변환하려고 시도했지만 운이 없습니다.

다시 말해, 나는 다음과 같이 나누고 싶다 string.

THExxQUICKxxBROWNxxFOX

by xx을 입력하고 값이 포함 된 배열을 반환합니다.

빠른, 갈색, 여우


2
향후 우려 사항 : 아래 의견 중 하나가 저에게 관심 이있어서 받아 들일 수있는 대답에서 비 직관적 (그러나 올바른) 방법에 관한 소프트웨어 엔지니어링에 대한 토론 을 시작하기로 결정 했습니다.
scharette

답변:


1239

문자열로 나누려면 문자열 배열 overload 를 사용해야합니다 .

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);

4
나는 실제로 두 가지 이유 때문에 이것에 대한 대답을 바꾸었다. 필자는 실제 최적화가 필요하지 않으며 Regex Split 방법 사용과 관련된 추가 오버 헤드가있는 것으로 보입니다.
Brandon

7
@Peter : 그 게시물에서 Jon은 포스터에 고정 된 구분자가 없기 때문에 제안하고 있습니다. 그는 "둘 이상의 공백"(2+를 의미)으로 구분 된 문자열을 분할하려고합니다. a로 구분 된 문자열의 패턴 이 아닌 , 정규식은 큰 (음,입니다 ) 옵션. 고정 값 구분 기호의 경우 불필요한 오버 헤드가 발생합니다. 테스트를 해보십시오. 작업 수가 증가함에 따라 RegEx는 해당하는 한 ~ 10x 정도를 차지합니다 string.Split.
Adam Robinson

9
파이썬에서 C #으로 왔습니다. 파이썬은 다른 문자열로 문자열 분할을 지원합니다. 그리고 나는 간단한 대답을 위해이 질문으로 돌아와야합니다. 이것은 string[] Split(string pattern)내가 생각할 수있는 가장 자연스러운 사용법입니다. 전에 C를 작성하여 배열을 char하는 데 익숙했지만 char[]C # 코드에서 팝업이 나타나는 것을 싫어 합니다. 갑자기 스트림 레벨에서 바이트 레벨로 관심을 끌기 때문입니다. C # 라이브러리 사용자가 왜 Split 메서드를 이와 같이 디자인했는지 아는 사람이 있습니까? 합당한 이유가 있다면 불편을 겪음에도 불구하고 감사 할 수 있습니다.
foresightyj

11
이 스 니펫은 C #이 아닌 개발자에게 부끄러워하는 일 목록에서 매우 높은 순위를 차지합니다.
Traubenfuchs

99
도대체 왜 안될까요 data.Split("xx")?
mcont

122

문자열 을 사용하는 Split과부하 가 있습니다.

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

이 StringSplitOptions 중 하나를 사용할 수 있습니다

  • 없음 -반환 값에 빈 문자열이 포함 된 배열 요소가 포함됩니다.
  • RemoveEmptyEntries- 리턴 값에 빈 문자열이 포함 된 배열 요소가 포함되지 않음

따라서 문자열이 "THExxQUICKxxxxBROWNxxFOX"인 StringSplitOptions.None경우 배열에서 "xxxx"부분에 대한 빈 항목을 반환하지만 StringSplitOptions.RemoveEmptyEntries그렇지 않습니다.


73
Regex.Split(string, "xx")

내가 보통하는 방식입니다.


물론 다음이 필요합니다.

using System.Text.RegularExpressions;

또는 :

System.Text.RegularExpressions.Regex.Split(string, "xx")

그러나 다시는 항상 그 라이브러리가 필요합니다.


13
@Brandon : 일반적으로 조기 최적화에 대해주의를 기울이고 있지만 정규 표현식 오버 헤드로 인해 RegEx.Splita가 단순한 것보다 약간 더 비싸다는 것을 알고 있어야합니다 String.Split.
Adam Robinson

9
임의의 문자열로 나누려면 Regex.Escape먼저 문자열을 사용 하면 정규식 메타 문자가 이스케이프됩니다.
Richard

오버 헤드 비용을 지불 할 수 있습니다 주요 장점 중 하나는 문자열 비교 설정을 제공 할 수있는 능력이다
티무르 Sadykov

47

이에 대한 String.Split 의 과부하가 있습니다 .

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);

1
불필요한 배열 유형 선언을 제거하는 유일한 대답입니다.
wonea

25

나는 일반적으로 내 자신의 확장을 사용하고 싶습니다.

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 


//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

그러나 Microsoft가 이후 버전에서이 메소드 오버로드를 포함하기로 결정하면 예외가 발생합니다. 마이크로 소프트가 그동안이 방법을 포함시키지 않은 이유이기도하다. 내가 일한 회사 중 적어도 하나는 모든 C # 프로젝트에서 그러한 확장을 사용했다.

메소드가 존재하지 않는 경우 런타임에 조건부로 메소드를 정의 할 수도 있습니다.


4
대안 적으로, 사용 params string[] splitter번째 매개 변수 변화 등을 new[] {splitter}하는 splitter다수의 분리를 지원한다.
Matthew Strawbridge

10

이전 답변이 모두 맞습니다. 한 단계 더 나아가 String에 확장 메소드 를 정의하여 C #이 작동하도록합니다 .

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

그렇게하면 처음으로 이것을 달성하려고 시도했을 때 순진하게 예상했던 간단한 방법으로 모든 문자열에서 호출 할 수 있습니다.

"a big long string with stuff to split on".Split("g str");


7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

바꾸기 문자를 신중하게 선택하십시오 (이미 문자열에 없을 가능성이 높은 문자를 선택하십시오)!


2
@MasoudHosseini : 완전한 답변을 읽으십시오; 이미 면책 조항이 있습니다.
SNag

3
@ kobe : 그것은 끔찍한 해킹이기 때문입니다.
Overv

3
잘 작동하지만 일반적인 방법에는 위험합니다
Kaizonaro

5
"끔찍한 해킹입니다"또는 "나쁜 답변"과 같은 설명은 도움이되지 않습니다. 설명이없는 의견 일뿐입니다. 대신 "문자열을 대체 할 문자열을 스캔 한 다음 성능이 저하되므로 분할 문자를 스캔 할 필요가 없습니다."와 같은 문구를 표시하십시오. 자신을 설명하는 더 좋은 방법이 될 것입니다. 너무 많은 프로그래머가 이런 식으로 행동합니다. :(
Matt Ruwe

1
문자열에 |이미 문자 가 포함되어 있다면 어떻게해야 한다고 생각합니다.
amd

-1

이것은 또한 쉽다 :

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

1
그러나 이것은 "THExQUICK"우리가 나누기를 원하지 않는 곳 에서도 나뉘어 질 것입니다
Rafalon

감사합니다 Rafalon : 네, 그렉의 가장 좋은 대답은 : data.Split (새 문자열 [] { "XX"}, StringSplitOptions.RemoveEmptyEntries)
user890255

-4

가장 쉬운 방법은 다음을 사용하는 것입니다 String.Replace.

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

또는 더 간단하게 :

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");

3
그대로, 이것은 (질문이 요구하는대로) 배열을 반환하지 않고의 쉼표가있는 문자열 만 반환합니다 xx.
Arj

그리고 문자열에 추가 쉼표가 포함되어 있으면 단어를 올바르게 나눌 수 없습니다.
user3658298
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.