如何从任务前置字符串中获取前置ID?

3

我正在处理MPXJ库。我想从下面的字符串中获取前置任务ID。对我来说这很复杂。请帮助我获得所有前置任务ID。谢谢。

任务的前置任务字符串:

Task Predecessors:[[Relation [Task id=12 uniqueID=145 name=Alibaba1] -> [Task id=10 uniqueID=143 name=Alibaba2]],
[Relation [Task id=12 uniqueID=145 name=Alibaba3] -> [Task id=11 uniqueID=144 name=Alibaba4]], [Relation [Task id=12 uniqueID=145 name=Alibaba5] -> [Task id=9 uniqueID=142 name=Alibaba6]]]

我需要获取前置任务的ID:10119

模式:

[Task id=12 uniqueID=145 name=Alibaba1] -> [Task id=10 uniqueID=143 name=Alibaba2]]
2个回答

3

无需捕获组。查看完整的C#在线演示

我的原始答案使用了捕获组,但我们并不需要它们。

您可以使用此正则表达式:

(?<=-> \[Task id=)\d+

请查看此C#在线演示的底部输出结果:
10
11
9
  • (?<=-> \[Task id=)反向引用确保我们前面是从箭头到等号的部分
  • \d+匹配id

这段C#代码将所有代码添加到resultList中:

var myRegex = new Regex(@"(?<=-> \[Task id=)\d+");
Match matchResult = myRegex.Match(s1);
while (matchResult.Success) {
resultList.Add(matchResult.Value);
Console.WriteLine(matchResult.Value);
matchResult = matchResult.NextMatch();
} 

带有捕获组的原始版本

为了给你提供另一个选择,这里是我的原始演示,使用了一个捕获组。

参考资料


3
要获取这些ID,您需要在->后查找任务ID。您可以尝试使用Matches方法来实现。
Regex rgx = new Regex(@"->\s*\[Task\s*id=(\d+)");

foreach (Match m in rgx.Matches(input))
        Console.WriteLine(m.Groups[1].Value);

工作演示

解释:

->          # '->'
\s*         # whitespace (\n, \r, \t, \f, and " ") (0 or more times)
\[          # '['
 Task       # 'Task'
 \s*        # whitespace (\n, \r, \t, \f, and " ") (0 or more times)
 id=        # 'id='
  (         # group and capture to \1:
   \d+      #   digits (0-9) (1 or more times)
  )         # end of \1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接