使用字符串操作或正则表达式分解字符串

时间:2013-09-26 13:42:04

标签: c# regex string

美好的一天,

有人可以帮助我朝着正确的方向前进。

我有一个字符串:

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

我总是收到像 [number] 这样的字符串: [Message]

[]内的变量是不同的变量。

3 个答案:

答案 0 :(得分:2)

这应该这样做:

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

根据您的Waffle Iron示例,它允许消息换行。

如果数字总是五位数,您可以使用[0-9]{5}代替[0-9]+

它使用命名捕获组((?<name> .. )位)来表示数字和消息,但当然可以使用普通捕获组,或者如果你要拆分它们则根本不使用单独排列,例如:

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


这些表达式的关键部分(匹配消息而不匹配下一个任务)分解为:

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

第一个选项匹配尽可能多的非换行符,如果失败,它会查找一个新行,后面没有新任务,然后重复多次(至少一次),直到它消耗了这条消息。 (如果邮件可以为空,请将最终+更改为*

答案 1 :(得分:2)

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

答案 2 :(得分:0)

正则表达式的优点是,它将过滤所有行。因为它们与模式不匹配。

类似于:^Task\s\d+:.+会做