擅长:python、mysql、java
<p>似乎403始终显示为第9个字段,由空格分隔,ip号始终位于行的开头。你知道吗</p>
<p>另一种选择是利用这些模式,并使用量词找到正确的部分,防止不必要的回溯。你知道吗</p>
<p>假设行的各个部分之间只有一个空格,则可以匹配到第一个403。然后匹配所有没有403的行,直到找到下一行。你知道吗</p>
<p>在第二个403之后,捕获下一行开头的第一个ip号码。你知道吗</p>
<pre><code>^\S+(?: \S+){7} 403 .*(?:\r?\n(?!\S+(?: \S+){7} 403 ).*)*\r?\n\S+(?: \S+){7} 403 .*(?:\r?\n|\r)+(\d{1,3}(?:\.\d{1,3}){3})
</code></pre>
<p><strong>解释</strong></p>
<ul>
<li><code>^</code>行首</li>
<li><code>\S+(?: \S+){7} 403 .*</code>匹配第9个字段的403并匹配行的其余部分</li>
<li><code>(?:</code>非捕获组
<ul>
<li><code>\r?\n(?!\S+(?: \S+){7} 403 ).*</code>匹配403不在第9个字段的整行</li>
</ul></li>
<li><code>)*</code>关闭非捕获组,重复0+次</li>
<li><code>\r?\n\S+(?: \S+){7} 403 .*</code>匹配1+个换行符,在第9个字段匹配403,并匹配行的其余部分</li>
<li><code>(?:\r?\n)+</code>匹配换行符的1+倍</li>
<li><code>(\d{1,3}(?:\.\d{1,3}){3})</code>第1组的捕获与ip样模式</li>
</ul>
<p><a href="https://regex101.com/r/W6VAtZ/1" rel="nofollow noreferrer">Regex demo</a></p>
<p>考虑到空格或制表符,可以使用<a href="https://regex101.com/r/Sgsu18/1" rel="nofollow noreferrer">this pattern</a></p>