我试图将文本解析为4个捕获组,但遇到了一个问题。在
我的正则表达式是:
(\d{1,5})\/(tcp|udp)\s+open\s+(\S+)\s*(.*)?
一些示例输入是:
^{pr2}$这几乎是完美的。问题出在135/udp的行上,没有version字段,因此我对该行的捕获组4正在环绕并捕获下一行的整个内容(从137/udp开始)。在
我希望捕获组4对于135/udp行(或版本字段为空的任何地方)为空/空。在
似乎我的最后一个.*
不应该经过行结束符,但它确实是。我还将?
包含在上一个捕获组之后,以尝试使其成为可选的,如允许空值。在
谁能指出我做错了什么?解释我的错误比仅仅提供一个有效的正则表达式更有帮助。在
\s
似乎与换行符匹配。这对我来说是意外的-我本以为\s
只匹配空白。在只尝试匹配制表符和空格:}。在
[ \t]
而不是{而且要求更高一点-这意味着设置使用
+
而不是*
的空格和非空格:(\d{1,5})\/(tcp|udp)[ \t]+open[ \t]+(\S+)[ \t]+(.*)
(\S+)
是open和spaces之后的一个条目。 但由于我们只对那些在那之后继续的线路感兴趣:[ \t]+
要求在该条目之后有空间(不包括在那里结束的那一行)(.*)
捕获该空间后面的所有内容。在正如bytepusher指出的,我有一个匹配换行符的\s。我用空格或制表符[\t]的显式匹配替换了\s,如:
最正确的是,我将/s的所有实例替换为与预期间隔字符匹配的显式匹配:
^{pr2}$相关问题 更多 >
编程相关推荐