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 [number] : [Message]

[] 里面的那些是会有所不同的变量。

4

3 回答 3

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]+:)
)+

第一个替代方案尽可能多地匹配非换行符,如果失败,它会寻找一个没有新任务跟随的换行符,然后尽可能多地重复此操作(至少一次),直到它被消耗消息。(如果消息可以为空,则将final更改+为a *

于 2013-09-26T13:50:13.310 回答
2
List<String> output=Regex.Matches(input,@"(?s)(?i)\bTask\b\s*\d+:.*?(?=\bTask\b|$)") 
                         .Cast<Match>()
                         .Select(x=>x.Value)
                         .ToList();
于 2013-09-26T14:09:22.073 回答
0

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

类似的东西:^Task\s\d+:.+会做

于 2013-09-26T13:43:54.153 回答