2013-09-26 3 views
1

Добрый день,Разбивка Строка со строкой Мануляция или регулярное выражение

Может кто-нибудь помочь мне в правильном направлении здесь.

У меня есть строка:

Task 10001:Bring cooldrinks 
Task 10005:Waffle Iron, 
this should of course be cleaned  
Task 10006:Remember Wife 
Task 10000:Leave children 

Как я нарушу его так, что я могу вставить его на задачу в список, как:

List(0) = Task 10001: Bring cooldrinks 
List(1) = Task 10005:Waffle Iron,this should of course be cleaned  
List(2) = Task 10006: Remember Wife 
List(3) = Task 10000: Leave children 

Я всегда получаю строку, как Task [номер]: [Сообщение]

Те внутри [] является переменным, которые будут отличаться.

ответ

2
List<String> output=Regex.Matches(input,@"(?s)(?i)\bTask\b\s*\d+:.*?(?=\bTask\b|$)") 
         .Cast<Match>() 
         .Select(x=>x.Value) 
         .ToList(); 
+0

Это не удастся для контента, например 'Task 10008: Find многозадачное программное обеспечение. Кроме того, выполнение ленивого совпадения '. *?', как правило, медленнее (поэтому я пошел на путь отрицательного класса/чередования). –

+0

@PeterBoughton нет, что не подведет. Это похоже на работу на моем компьютере – Anirudha

+0

Э? Это делает ленивый '. *?' С нечувствительным к регистру взглядом для 'Task', поэтому он будет соответствовать' Task 10008: Find multi' вместо того, чтобы потреблять все сообщение. –

0

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

Что-то вроде: ^Task\s\d+:.+ будет делать

2

Это следует сделать это:

Task (?<number>[0-9]+):(?<message>(?:[^\n]+|\n(?!Task [0-9]+:))+) 

Это позволяет сообщения переносить строки, в соответствии с вашим примером вафельница.

Если номера всегда пяти цифр, вы можете использовать [0-9]{5} вместо [0-9]+

Он использует именованные группы захвата ((?<name> .. ) бит) для номера и сообщений, но, конечно, можно использовать обычные группы перехвата, или вообще, если вы собираетесь разделить строки отдельно, например:

Task [0-9]+:(?:[^\n]+|\n(?!Task [0-9]+:))+ 


ключевая часть этих выражений (соответствие сообщения без согласования следующей задачи) сломанных вниз:

(?: 
    [^\n]+ 
| 
    \n(?!Task [0-9]+:) 
)+ 

Первый вариант соответствует как можно больше, не символы перевода строки, как он может, если он не выглядит для перехода на новую строку, которая не сопровождается новой задачи, затем повторяет это столько раз, сколько он может (по крайней мере, один раз) до тех пор, пока он не испортил сообщение. (Если сообщение может быть пустым, изменить последний + к *)

+0

Jeeze эти регулярные выражения, спасибо за answer.I'll нужно будет изучить ваши объяснения. – user1702369

+0

Нет проблем, дайте мне знать, если есть что-то, что не имеет смысла. btw, [вот некоторая информация о выполнении именованных групп в C#] (http://stackoverflow.com/questions/906493/regex-named-capturing-groups-in-net) –

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