2012-01-18 4 views
3

А имеет следующую входную строку:Отдельные длинная строка

string input = 
    "Ta005000000000000000000Tb001700000000000000000Sa005000000000000000000" + 
    "Sb002500000000000000000F  00000000000000000I  00000000000000000N" + 
    "  00000000000000000FS 00000000000000000IS 00000000000000000NS" + 
    " 00000000000000000"; 

мне нужно разделить эту строку на часть, однако, содержание значительно варьируется.

должны позволить эту строку в список, как:

[0] "Ta005000000000000000000" 
[1] "Tb001700000000000000000" 
[2] "Sa005000000000000000000" 
[3] "Sb002500000000000000000" 
[4] "00000000000000000I" 
[5] "00000000000000000N" 
[6] "0000000000000000FS" 
[7] "0000000000000000IS" 
[8] "0000000000000000NS" 
[9] "000000000000000000" 

Единственное, что я знаю, что в данном случае является то, что максимальная длина строки равна 23. Таким образом, в этом примере, мне нужно для разделения «T» или «S» части fisrt возврата строки. Или, если у вас нет появления этих символов, разделенных пробелом (это происходит в последней части моего возврата строки). Я сделал так:

var linq = test.Split(new[] { 'T', 'S', ' ', '{', '}' }, StringSplitOptions.RemoveEmptyEntries).ToList(); 

Мой «тест» - это StrintBuilder, содержащий эти обратные символы. Делая это, я могу отделить свой список, но в этом случае я потерял для меня очень важную информацию, которая является «T» и «S».

Ну, не знаю, было ли это ясно, но это кажется чем-то таким простым и дает мне огромную головную боль.

Обс: Другая проблема заключается в том, что, например: «0000000000000000FS», в этой части строки мне нужно поддерживать «FS» вместе.

Благодарим Вас за внимание,

+0

вопрос о дублировании: [C# split string, но сохраняйте раздельные символы/разделители] (http://stackoverflow.com/questions/521146/c-sharp-split-string-but-keep-split-chars-separators) – Default

+0

Are вы уверены, что ваши частичные строки могут начинаться только с «T» или «S»? Эта последняя часть вашей строки ввода отличается от первой части. – Groo

+0

Да, вы правы. Единственное, что я знаю, это то, что максимальная длина строки равна 23. Я собираюсь изменить свой вопрос. –

ответ

6

Split удаляет расщепляющий характер. Просто замените их как показано ниже, чтобы вставить пробелы, а затем разделить на символ пробела:

var linq = myRates.Replace("T"," T").Replace("S"," S").Split(new[] { ' ', '{', '}' }, StringSplitOptions.RemoveEmptyEntries).ToList(); 

EDIT

Это правило очень сложно. Возможно, это решает вашу проблему.

string input = 
    "Ta005000000000000000000Tb001700000000000000000Sa005000000000000000000" + 
    "Sb002500000000000000000F  00000000000000000I  00000000000000000" + 
    "N  00000000000000000FS 00000000000000000IS 00000000000000000" + 
    "NS 00000000000000000"; 

Первый шаг: разделение на ''

string[] spaceSplit = input.Split(' ', StringSplitOptions.RemoveEmptyEntries); 

Теперь spaceSplit выглядит следующим образом:

[0] "Ta005000000000000000000Tb001700000000000000000Sa005000000000000000000Sb002500000000000000000F" 
[1] "00000000000000000I" 
[2] "00000000000000000N" 
[3] "0000000000000000FS" 
[4] "0000000000000000IS" 
[5] "0000000000000000NS" 
[6] "000000000000000000" 

Теперь разделить каждую строку, если она длиннее 23 символов, 'T' и 'S'

List<string> temp = new List<string>(); 
foreach(string s in spaceSplit) 
    if (s.Length>23) 
    temp.AddRange(s.Replace("T", " T").Replace("S", " S").Split(' ')); 
    else 
    temp.Add(s); 

temp.ToArray() дает

[0] "Ta005000000000000000000" 
[1] "Tb001700000000000000000" 
[2] "Sa005000000000000000000" 
[3] "Sb002500000000000000000F" 
[4] "00000000000000000I" 
[5] "00000000000000000N" 
[6] "0000000000000000FS" 
[7] "0000000000000000IS" 
[8] "0000000000000000NS" 
[9] "000000000000000000" 

var linq = (from s in temp select s.Substring(0,23)).ToList(); 

вуаля, linq это массив вы хотите. Но для других комбинаций ввода этот «алгоритм» может сломаться.

+0

Да, я знаю, Regex намного лучше, но я не могу вспомнить эти вещи :) Это похоже на мистическую серебряную пулю, которая меня ползает ... – Matten

+2

зависит от того, будет ли человек, который впоследствии поддерживает код, знает регулярное выражение или нет :) Я бы понял этот код лучше, чем регулярное выражение. – Default

+0

Да, это работает, но по частям. Проблема в том, что, например: «0000000000000000FS», в этой части строки Мне нужно поддерживать «FS» вместе. Используя этот код, «S», который мне нужно поддерживать, всегда разделяется. Вы понимаете? –

3

Что-то вроде этого?

string[] separatedString = Regex.Split(s, @"(?=[TS ])") ; 

, то вы просто должны удалить «пустые» элементы, если вы хотите

+0

Ударьте меня к этому через несколько секунд! Это действительно то, что здесь происходит после того, насколько я вижу. –

+3

[дубликат ответа] (http://stackoverflow.com/a/521172/238902) к [дублирующему вопросу] (http://stackoverflow.com/questions/521146/c-sharp-split-string-but-keep -split-chars-separators): P – Default

+0

Похоже, что это ... Я также ознакомлюсь с регулярными выражениями на [this] (http://www.codeproject.com/KB/dotnet/regextutorial.aspx) адресе и эта строка кода уже была в моем «тестовом» решении :) –

1

Использование регулярных выражений для этого:

string[] parts = Regex.Split(test, @"(?<=[TS\s\{\})"); 

Я не уверен, если фигурные скобки правильно отформатирован.

Смежные вопросы