如何从任务前驱字符串中获取前任id?

时间:2014-06-20 03:46:10

标签: c# regex regular-language mpxj mpp

我正在研究MPXJ库。我想从下面的字符串中获取前辈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 个答案:

答案 0 :(得分:3)

无需捕获组。查看完整的C# online demo

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

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

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

请参阅此C# online demo最底部的输出:

10
11
9
  • (?<=-> \[Task id=) lookbehind确保我们前面有从箭头到等号的部分
  • \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();
} 

包含捕获组的原始版本

为了给你第二个选项,这是我的original demo使用捕获组。

<强>参考

答案 1 :(得分: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);

Working Demo

<强>解释

->          # '->'
\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