我正在尝试解析4个捕获组中的文本,但遇到了一个问题。
我的正则表达式是:
(\d{1,5})\/(tcp|udp)\s+open\s+(\S+)\s*(.*)?以下是一些示例输入:
Nmap scan report for X
Host is up (0.097s latency).
Not shown: 192 closed ports
PORT STATE SERVICE VERSION
135/udp open msrpc
137/udp open netbios-ns Microsoft Windows XP netbios-ssn (workgroup: THINC)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows XP microsoft-ds这几乎可以完美地工作。问题出在135/udp行上,没有版本字段,所以我对该行的捕获组4会绕过并抓取整个下一行(从137/udp开始)。
我希望135/udp行的捕获组4为空/ null (或版本字段为空的任何位置)。
看起来我的最后一个.*不应该超过行终止符,但它确实是。我还在我的最后一个捕获组之后添加了?,以使其成为可选的,如允许空值。
谁能指出我做错了什么?解释我的错误要比仅仅提供一个有效的正则表达式更有帮助。
发布于 2017-07-10 08:53:54
\s似乎正在匹配换行符。这对我来说是意想不到的--我原本期望\s只匹配空格。
尝试只匹配制表符和空格:用[ \t]代替\s。
而且要求更高-这意味着设置+所期望的空格和非空格,而不是*
(\d{1,5})\/(tcp|udp)[ \t]+open[ \t]+(\S+)[ \t]+(.*)
(\S+)是在open和spaces之后预期的一个条目。但是,因为我们只对后面的那些行感兴趣:[ \t]+要求在该条目之后有空格(不包括在那里结束的行)- (.*)捕获了空格之后的所有行。
发布于 2017-07-10 09:17:32
正如bytepusher所指出的,我有一个\s来匹配换行符。我将\s替换为空格或制表符\t的显式匹配,如下所示:
(\d{1,5})\/(tcp|udp)\s+open\s+(\S+)[ \t]*(.*)?最正确的是,我用预期的空格字符的显式匹配替换了/s的所有实例:
(\d{1,5})\/(tcp|udp)[ \t]+open[ \t]+(\S+)[ \t]*(.*)?https://stackoverflow.com/questions/45002313
复制相似问题