如何在C#.NET正则表达式中捕获命名组?

时间:2010-07-08 21:04:58

标签: c# regex

我正在尝试使用命名组来解析字符串。

示例输入是:

exitcode: 0; session id is RDP-Tcp#2

我的尝试正则表达式是:

("(exitCode)+(\s)*:(\s)*(?<exitCode>[^;]+)(\s)*;(\s)*(session id is)(\s)*(?<sessionID>[^;]*)(\s)*");

我的语法在哪里错了?

由于

2 个答案:

答案 0 :(得分:3)

在你的例子中:

exitcode: 0; session id is RDP-Tcp#2

它不以分号结尾,但似乎你的正则表达式需要一个分号来标记sessionID的结尾:

(?<sessionID>[^;]*)

我注意到,在你的两个命名组之后,你有可选的空格匹配 - 也许这有助于在字符类中添加空格,如下所示:

(?<exitCode>[^;\s]+)
(?<sessionID>[^;\s]*)

更好的是,首先在分号上拆分字符串,然后你甚至可能不需要正则表达式。在拆分后使用这两个子串,exitcode和sessionID碰巧位于字符串的末尾,这样可以很容易地解析它们:

exitcode: 0
session id is RDP-Tcp#2

答案 1 :(得分:0)

理查德的回答确实已经覆盖了它 - 要么删除或者在结尾处选择分号,它应该可以工作,并且肯定会考虑将空白放在否定的类中,或者只是在分号上分开,但需要额外的一点思考。 :)


不要在没有必要的地方打扰 - 看起来你的输出是某种形式的日志或其他东西,所以它应该更可预测,如果是这样的话,更简单的事情可以做:

exitcode: (?<exitCode>\d+);\s+session id is\s+(?<sessionID>[^;\s]*);? 


对于分号分割,你将获得一个包含两个对象的数组 - 这里是一些伪代码,假设exitcode是数字,而sessionid没有空格:

splitresult = input.split('\s*;\s*')
exitCode  = splitresult[0].match('\d+')
sessionId = splitresult[1].match('\S*$')

根据维护代码的人员,可能会认为这比上面的表达式更具可读性。