C #의 첫 번째 구분자에만 String.Split?


78

String.Split은 구분 기호에 여러 부분으로 문자열을 분할하는 데 편리합니다.

첫 번째 구분 기호에서만 문자열을 분할하려면 어떻게해야합니까? 예 : 문자열이 있습니다

"Time: 10:12:12\r\n"

그리고 나는 다음과 같은 배열을 원합니다.

{"Time","10:12:12\r\n"}

공백을 사용하여 분할? 그리고 설정 arry = yourString.Split ( '');
Ramgy Borja

1
@RamgyBorja는 그가 또한 요청 된 것이 아니라 :에서 Time및 어쨌든 트림하지 않는 한 작동하지 않을 것입니다
smurtagh

@smurtagh 예, 안전을 위해 트림을 사용 코딩
Ramgy 보르

답변:


146

최선의 접근 방식은 가능한 추가 공간 등과 관련하여 구문 분석이 얼마나 유연하기를 원하는지에 따라 약간 다릅니다. 필요한 내용을 보려면 정확한 형식 사양을 확인하십시오.

yourString.Split(new char[] { ':' }, 2)

두 개의 2 개의 하위 문자열을 제한합니다. 그러나 이것은 두 번째 문자열의 시작 부분에있는 공백을 자르지 않습니다. 그러나 분할 후 두 번째 작업에서이를 수행 할 수 있습니다.

yourString.Split(new char[] { ':', ' ' }, 2,
    StringSplitOptions.RemoveEmptyEntries)

작동하지만 공백이 포함 된 헤더 이름을 분할하려고하면 중단됩니다.

yourString.Split(new string[] { ": " }, 2,
    StringSplitOptions.None);

설명하는대로 정확하게 수행하지만 실제로는 공간이 있어야합니다.

yourString.Split(new string[] { ": ", ":" }, 2,
    StringSplitOptions.None);

공간을 선택 사항으로 만들지 만 TrimStart()둘 이상의 공간이있는 경우에는 여전히 필요 합니다.

형식을 다소 유연하게 유지하고 코드를 읽기 쉽게하려면 첫 번째 옵션을 사용하는 것이 좋습니다.

string[] split = yourString.Split(new char[] { ':' }, 2);
// Optionally check split.Length here
split[1] = split[1].TrimStart();

(String [], Int32, StringSplitOptions) 오버로드를 사용하지 않는 이유는 무엇입니까? ( msdn.microsoft.com/en-us/library/1bwe3zdy.aspx ). 이는 .NET 2.0 이상에만 적용되지만 다음은 OP가 요청한 결과를 정확하게 제공합니다. yourString.Split (new string [] { ":"}, 2, StringSplitOptions.None)
bernhof

@Bernhof : 그렇습니다. 그러나 문자열에 여분의 공백이 있거나 공백이없는 경우 어떻게해야하는지 잘 모르겠습니다. 가장 좋은 방법은 원하는 동작에 따라 조금씩 다릅니다.
Thorarin 2010 년

2
yourString.Split ( ':', 2);와 같은 것이 매우 혼란 스럽습니다. 작동하지 않습니다 ... 설명해 주셔서 감사합니다!
세바스찬

1
.Select(s=> s.Trim())나는 종종 분할의 결과를 트림하는 방법입니다
AaronLS

14

위의 예에서 ":"(즉, 후행 공백이있는 콜론)으로 분할 할 수 있습니다. 실제로 첫 번째 구분선 만 분할 한 경우 두 번째 배열 요소에 선행 공백이 표시됩니다.

그러나이 Split의 과부하를 살펴 봐야합니다.

http://msdn.microsoft.com/en-us/library/c1bs0eda.aspx

public string[] Split(
  char[] separator,
  int count
)

... 최대 하위 문자열 수를 지정할 수 있습니다.


3
?("Time: 10:12:12\r\n").Split(new char[] { ':', ' ' }, 2, 
   StringSplitOptions.RemoveEmptyEntries)
{Dimensions:[2]}
    [0]: "Time"
    [1]: "10:12:12\r\n"

다른 옵션:

?("Time: 10:12:12\r\n").Split(new char[] { ':' }, 2)
{Dimensions:[2]}
    [0]: "Time"
    [1]: " 10:12:12\r\n"
?("Time: 10:12:12\r\n").Split(new char[] { ':' }, 1)
{Dimensions:[1]}
    [0]: "Time: 10:12:12\r\n"
?("Time: 10:12:12\r\n").Split(new char[] { ':' }, 3)
{Dimensions:[3]}
    [0]: "Time"
    [1]: " 10"
    [2]: "12:12\r\n"

구분 기호는 공백이 아니라 콜론입니다. 공간 분할은 괜찮을 것이고 2 개의 요소를 줄 것이라는 말이 맞지만, 그것이 질문되는 질문이라고 생각하지 않습니다.
Martin Peck

1

위의 Thorarin의 답변에 대한 변형을 채택했습니다. 아래는 귀하의 요구 사항을 처리하고 공간을 다듬을 수 있어야합니다.

yourString.Split(new []{'-'},2).Select(s => s.Trim())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.