首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复这个正则表达式?(nmap结果)

如何修复这个正则表达式?(nmap结果)
EN

Stack Overflow用户
提问于 2017-07-10 08:28:43
回答 2查看 578关注 0票数 1

我正在尝试解析4个捕获组中的文本,但遇到了一个问题。

我的正则表达式是:

代码语言:javascript
复制
(\d{1,5})\/(tcp|udp)\s+open\s+(\S+)\s*(.*)?

以下是一些示例输入:

代码语言:javascript
复制
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 (或版本字段为空的任何位置)。

看起来我的最后一个.*不应该超过行终止符,但它确实是。我还在我的最后一个捕获组之后添加了?,以使其成为可选的,如允许空值。

谁能指出我做错了什么?解释我的错误要比仅仅提供一个有效的正则表达式更有帮助。

Visual representation

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-10 08:53:54

\s似乎正在匹配换行符。这对我来说是意想不到的--我原本期望\s只匹配空格。

尝试只匹配制表符和空格:用[ \t]代替\s

而且要求更高-这意味着设置+所期望的空格和非空格,而不是*

(\d{1,5})\/(tcp|udp)[ \t]+open[ \t]+(\S+)[ \t]+(.*)

(\S+)是在open和spaces之后预期的一个条目。但是,因为我们只对后面的那些行感兴趣:[ \t]+要求在该条目之后有空格(不包括在那里结束的行)- (.*)捕获了空格之后的所有行。

票数 1
EN

Stack Overflow用户

发布于 2017-07-10 09:17:32

正如bytepusher所指出的,我有一个\s来匹配换行符。我将\s替换为空格或制表符\t的显式匹配,如下所示:

代码语言:javascript
复制
(\d{1,5})\/(tcp|udp)\s+open\s+(\S+)[ \t]*(.*)?

最正确的是,我用预期的空格字符的显式匹配替换了/s的所有实例:

代码语言:javascript
复制
(\d{1,5})\/(tcp|udp)[ \t]+open[ \t]+(\S+)[ \t]*(.*)?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45002313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档