regex Scan可用于正则表达式,但无法捕获完整输出

omvjsjqw  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(88)

看起来,当我试图“分组”我的匹配,我只提出了关键字,我正在寻找,而不是整个匹配。
例如,下面是我的示例输出:

Nmap scan report for scanme.nmap.org ([external-ip])
Host is up (0.082s latency).
Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f
Not shown: 992 closed tcp ports (reset)
PORT      STATE    SERVICE
22/tcp    open     ssh
25/tcp    filtered smtp
80/tcp    filtered http
135/tcp   filtered msrpc
139/tcp   filtered netbios-ssn
445/tcp   filtered microsoft-ds
9929/tcp  open     nping-echo
31337/tcp open     Elite

Read data files from: /usr/bin/../share/nmap
# Nmap done at Tue Oct 11 01:08:22 2022 -- 1 IP address (1 host up) scanned in 2.31 seconds

Nmap scan report for scanme.nmap.org ([external-ip])
Host is up (0.082s latency).
Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f
Not shown: 992 closed tcp ports (reset)
PORT      STATE    SERVICE
22/tcp    open     ssh
25/tcp    filtered smtp
80/tcp    filtered http
135/tcp   filtered msrpc
139/tcp   filtered netbios-ssn
445/tcp   filtered microsoft-ds
9929/tcp  open     nping-echo
31337/tcp open     Elite

Read data files from: /usr/bin/../share/nmap
# Nmap done at Tue Oct 11 01:08:22 2022 -- 1 IP address (1 host up) scanned in 2.31 seconds

我特别要寻找的是如何从“www.example.com的Nmap扫描报告“开始scanme.nmap.org一直到“读取数据”之前的行,如果它包含31337/tcp和/或22/tcp,则匹配此行。下一个“匹配”,所以本质上我可以调用output 1或output[2],因为我的示例输出包含2个“组”并且两个组都匹配我的一个或多个关键字。
使用正则表达式Nmap scan report for scanme.nmap.org.*?(22|31337)\/tcp.*?(?=Read data|Nmap scan)并使用output.scan(/#{regexp}/m),我只得到以下结果:

22
22

而不是包含2个元素的数组,在每个组中匹配31337/tcp或22/tcp。
如果我使用.match(/#{regexp}/m),那么这个 sorta 就可以工作。它得到1个匹配而不是2个。

编辑

使用更新的正则表达式,我想将这些多个“匹配”组合成一个数组,如下所示:

mbjcgjjk

mbjcgjjk1#

我对你的正则表达式做了一个小小的修改:我也省略了点,还在最后的前瞻中添加了一组新的括号。
注意:注意“点”也必须与新行匹配-即,整个文本必须被视为一行。

Nmap scan report for scanme\.nmap\.org.*?(22|31337)\/tcp.*?(?=(Read data|Nmap scan))

使用以下正则表达式跳过尾随空格:

Nmap scan report for scanme\.nmap\.org.*?(22|31337)\/tcp.*?(?=(\s*Read data|\s*Nmap scan))

如果存在匹配项,则捕获整个“段落”:

(Nmap scan report for scanme\.nmap\.org[^#]*?(22|31337)\/tcp.*?)(?=(\s*Read data|\s*Nmap scan))

测试here

相关问题