String에서 공백을 지정하는 가장 좋은 방법입니다.


243

다음과 같이 공백을 기준으로 문자열을 분할합니다.

string myStr = "The quick brown fox jumps over the lazy dog";

char[] whitespace = new char[] { ' ', '\t' };
string[] ssizes = myStr.Split(whitespace);

내 코드의 모든 곳에서 char [] 배열을 정의하는 것은 성가신 일입니다. 문자 배열을 만들 필요가없는보다 효율적인 방법이 있습니까 (다른 장소에서 복사하면 오류가 발생하기 쉽습니다)?


1
이것을한다 : myStr.Split ( ''); 작동하지?
woolagaroo

4
이것을 올바르게 이해하면 일반적인 공백이 아닌 공백 만 검색합니다.

중복 가능성도 참조하십시오. 그러나이 답변에는 SplitStringOptions가 있습니다. stackoverflow.com/questions/1562981/…
goodeye

답변:


469

방금 전화하면 :

string[] ssize = myStr.Split(null);

또는:

string[] ssize = myStr.Split(new char[0]);

공백 문자는 분할 문자로 간주됩니다. 보내는 사람 string.Split(char[])방법의 설명서 페이지 .

separator 매개 변수가 null문자를 포함하거나 포함하지 않으면 공백 문자는 분리 문자로 간주됩니다. 공백 문자는 유니 코드 표준으로 정의되며 메소드에 true전달되면 리턴 됩니다 Char.IsWhiteSpace.

항상, 항상, 항상 설명서를 읽으십시오!


2
공백으로 나누는 문제는 다시 공백을 만들어야한다면 어떤 공백 문자를 다시 넣어야하는지 알 수 없다는 것입니다.
로스 Presser

19
(char[])null새 객체를 만들지 않기 때문에 약간 좋습니다. ( 오버로드 null와 함께 사용할 수 없습니다 options).
Artfunkel

5
@RossPresser : 문자열을 다시 넣는 것은 완전히 다른 문제이므로 여기서는 이것이 문제라고 말할 수는 없습니다. 그러나 문자열을 이전과 똑같이 다시 맞추기 만하면 원본을 유지하는 것이 좋습니다.
stakx-더 이상

4
어리석은 질문이지만,를 사용하는 경우 null여전히을 지정해야 StringSplitOption.RemoveEmptyEntries합니까 아니면 기본적으로 무시됩니까?
yu_ominae

2
@RossPresser : String.Split은 문자열을 분할하는 데 사용되는 문자를 추적하는 메커니즘을 제공하지 않으므로 관찰 결과는 적합하지 않습니다. String.Split을 사용하여 원하는 것을 얻을 수 없으므로 다른 Q & A가 필요합니다.
ToolmakerSteve

207

예, 여기에 하나 더 답변이 필요합니다!

모든 용액은 지금까지의 다소 제한 도메인 주소 정규 입력 A : 재치에, 단일 공백 문자 요소 (모자 팁이 적어도 문제를 언급하기 위해 @cherno하지만). 그러나 나는 모든하지만 가장 모호한 상황에서, 모든 이들의 분할이 있음을 제출 해야 동일한 결과를 얻을 :

string myStrA = "The quick brown fox jumps over the lazy dog";
string myStrB = "The  quick  brown  fox  jumps  over  the  lazy  dog";
string myStrC = "The quick brown fox      jumps over the lazy dog";
string myStrD = "   The quick brown fox jumps over the lazy dog";

String.Split(여기서 다른 답변 전체에 표시된 맛 RemoveEmptyEntries중 하나)은 다음 중 하나 를 사용하여 옵션 을 첨부하지 않으면 제대로 작동하지 않습니다 .

myStr.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)
myStr.Split(new char[] {' ','\t'}, StringSplitOptions.RemoveEmptyEntries)

그림에서 알 수 있듯이 옵션을 생략하면 네 가지 다른 결과 (A, B, C 및 D로 표시)와 네 가지 입력 모두에서 단일 결과를 얻을 수 있습니다 RemoveEmptyEntries.

String.Split 대 Regex.Split

물론 옵션 사용을 좋아하지 않는다면 정규식 대안을 사용하십시오 :-)

Regex.Split(myStr, @"\s+").Where(s => s != string.Empty)

4
@RossPresser, 그것은 내 한정자가 "가장 모호한 시나리오를 제외하고는 다름 아닌"시나리오에 포함되어 있다고 생각합니다. 왜냐하면 요소를 다시 조합하고 싶을 때조차도 여러 공간을 염두에 두어야 할 경우가 많기 때문입니다. 나는 정식 형태를 원할 것입니다-각각 사이에 하나의 공간. 그래서 저는 정중하게 동의하지 않습니다. "보통 잘못"이 아니라 "거의 잘못"입니다.
Michael Sorens

1
CapitalizeEveryWord("This is line one.\n \nThis is line three.")
Ross Presser

3
이것이 불분명하다고 생각한다면, 우리는 동의하지 않는 데 동의해야 할 것 같지만, 소프트웨어에서이 기능을 사용하지 않으면 직업을 잃게됩니다. 사용자는 자신이 원하는 방식으로 콘텐츠를 좋아합니다.
Ross Presser

4
이 답변은 훨씬 더 완전하므로 허용되는 답변이어야합니다.
Dennis

1
왜 당신 .Where(s => s != string.Empty)이 정규식에 추가했는지 궁금 합니다. \s+공백을 여러 개 지정하면 그 사이에 빈 항목이있을 수 없습니다.
잭 밀러

44

설명서 에 따르면 :

separator 매개 변수가 널이거나 문자를 포함하지 않으면 공백 문자가 분리 문자로 간주됩니다. 공백 문자는 유니 코드 표준으로 정의되며 Char.IsWhiteSpace 메서드에 전달되면 true를 반환합니다.

그러니 그냥 전화 myStr.Split();때문에 아무것도 통과 할 필요가 없습니다 구분 A는 params배열.


11

왜 사용하지 않습니까? :

string[] ssizes = myStr.Split(' ', '\t');

2
두 문자를 사용하는 분할 과부하는 없습니다.
takrl

1
@takrl : 여기를보세요 public string [] Split (params char [] separator) .NET v2
Renatas M.

예, 이것은 문자 배열을 취합니다. 코드 스 니펫은 두 개의 단일 문자를 전달합니다.
takrl

15
@takrl : params 키워드가 무엇인지 아십니까 ???
Renatas M.

꽤 시원합니다. +1입니다. 공감 한 사람도 몰랐을 것입니다.
takrl

3

인접한 공백은 사용하는 경우에도 단일 구분 기호로 취급되지 않습니다. String.Split(null) . 토큰 중 하나가 여러 공백 또는 탭으로 분리 된 경우 배열에 빈 문자열이 반환됩니다.

설명서에서 :

구분 기호의 각 요소는 별도의 구분 문자를 정의합니다. 두 개의 분리 문자가 인접하거나이 인스턴스의 시작 또는 끝에 분리 문자가있는 경우 해당 배열 요소는 Empty를 포함합니다.


2

따라서 복사하여 붙여 넣지 마십시오! 분할을 수행하고 재사용 할 함수를 추출하십시오.

public static string[] SplitWhitespace (string input)
{
    char[] whitespace = new char[] { ' ', '\t' };
    return input.Split(whitespace);
}

코드 재사용은 당신의 친구입니다.



1

당신이 사용할 수있는

var FirstString = YourString.Split (). First ();

문자열을 분할합니다.


0

인라인 할 수 없습니까?

var sizes = subject.Split(new char[] { ' ', '\t' });

그렇지 않으면이 정확한 작업을 자주 수행하면 항상 상수 또는 해당 char 배열을 포함하는 것을 만들 수 있습니다.

다른 사람들이 언급했듯이 문서에 따라 사용 null하거나 빈 배열을 사용할 수 있습니다 . 그렇게하면 공백 문자가 자동으로 사용됩니다.

var sizes = subject.Split(null);

0

동일한 코드를 반복하는 것이 문제인 경우 분할 논리를 캡슐화하는 확장 클래스를 String 클래스에 작성하십시오.


1
이것은 실제로 질문에 대답하지 않습니다. 죄송합니다.
p.campbell

피. campbell : 그렇습니다. OP는 어디서나 문자 배열을 복사 할 필요가없는 솔루션을 요청했습니다. 확실한 해결책은 작업을 수행하는 함수를 만드는 것입니다. 이 답변은 그러한 기능이 확장 방법 일 수 있음을 지적합니다. (대답은 ... 그렇게 할 수있는 코드를 보여줌으로써 개선 될 수있다)
ToolmakerSteve

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.