我正在尝试使用命名组来解析字符串。
示例输入是:
exitcode: 0; session id is RDP-Tcp#2
我的尝试正则表达式是:
("(exitCode)+(\s)*:(\s)*(?<exitCode>[^;]+)(\s)*;(\s)*(session id is)(\s)*(?<sessionID>[^;]*)(\s)*");
我的语法在哪里错了?
由于
答案 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*$')
根据维护代码的人员,可能会认为这比上面的表达式更具可读性。