【问题标题】:PowerShell Regex Ignore up until character string match including string matchPowerShell正则表达式忽略直到字符串匹配,包括字符串匹配
【发布时间】:2020-06-19 17:30:24
【问题描述】:

我正在尝试读取文件并忽略所有内容,直到字符匹配。有时字符匹配会与我需要的结果出现在同一行,所以我不能做 Select-Object -Skip x 其中x 是从文档返回的行数。

我尝试在结果上使用.Split('<pre>') 方法,结果有效,但我无法选择索引,因为它是返回的多行字符串。

下面是文本返回示例的开始。这是我试图从中读取数据的 HTML 响应。我不能使用Content,因为它在 ByteArray 中并且每个字符之间都有一个空格。所以我得出结论,是时候在 PowerShell 中通过 [Regex] 寻求帮助了。

我正在查看this answer,并认为我可以通过像这样替换搜索字符串来使用/.+?(?=abc)/

(Get-Content $env:TEMP\test.txt) | ForEach-Object { 
    [Regex]::Match($_, "^.+(?=\<pre\>)").Value
}

那也没用。在寻找 {\d\d\d} 之类的匹配项以确保其长度为 3 位时,我可以使用正则表达式,但我不确定在这种情况下如何使用它。

这是被返回文件的开始。我需要忽略直到并包括字符 &lt;pre&gt; 的所有内容,然后到文件末尾的所有内容都可以。

此处返回的示例命令和结果:

PS> Get-Content $env:TEMP\test.txt

HTTP/1.1 200 OK
Content-Length: 3524
Date: Thu, 18 Jun 2020 15:00:05 GMT
Last-Modified: Fri, 19 Jun 2020 01:00:05 GMT
Server: TTWS/1.2 on Microsoft-HTTPAPI/2.0

<!doctype html><html><body>
    <p>Test TCP WebServer 1.2</p>
    <pre>

    Directory: C:\tmp

编辑:

我现在有这个,它会删除直到并包括第一个 &lt;pre&gt; 标记在内的所有内容,还删除结束 &lt;/pre&gt; 标记,但不会删除结束 &lt;/pre&gt; 标记之后的任何内容。

(Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?<pre>' -replace '<\/pre>(.+?)'

是否可以将其扩展到文件末尾?

【问题讨论】:

  • (Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?&lt;pre&gt;' 可能对你有用。
  • 尝试 '(?s)^.*?(?=&lt;pre\s*&gt;)' 匹配直到
    。如果想忽略并将 pre 匹配到 pre 是不同的
  • 所以,本质上,你想要
     标签之间的文本?
  • 你想达到什么目的?
  • Get-Content $input_path -Raw | Select-String -Pattern '(?s)(?&lt;=&lt;pre&gt;\s*).*?(?=\s*&lt;pre&gt;)' -AllMatches | % { $_.Matches } | % { $_.Value } &gt; $output_file

标签: regex powershell


【解决方案1】:

.+? 模式是“懒惰的”,非贪婪的。这意味着它将匹配允许匹配的最少字符数。由于模式末尾有.+?,并且.+? 匹配1 个或多个字符,它将匹配一个 字符并退出。您需要一个贪婪量词*+

此外,如果您使用捕获组,则可以使用单个 -replace 命令实现所需的功能。

你需要使用

(Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?<pre>(.*?)</pre>.*', '$1'

它将获取整个文件内容并获取第一个&lt;pre&gt;字符串和最近的&lt;/pre&gt;之间的文本内容。

模式详情

  • (?s) - RegexOptions.Singleline 内联修饰符使 . 也匹配换行符
  • ^ - 字符串开头
  • .*? - 尽可能少的零个或多个字符
  • &lt;pre&gt; - &lt;pre&gt; 文字
  • (.*?) - 捕获组 #1:尽可能少的任何零个或多个字符
  • &lt;/pre&gt; - &lt;/pre&gt; 文字
  • .* - 尽可能多的任何零个或多个字符(因为* 是一个贪婪的量词)。

替换模式中的$1 将恢复结果中的第 1 组值(因此,它将保留)。

【讨论】:

  • 感谢您提供额外的内容并给予我更好的监督。我通常只使用正则表达式来匹配我在字符串中寻找的内容,但仅此而已。这真的很有帮助!谢谢!
猜你喜欢
  • 2021-01-31
  • 2015-03-05
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2013-09-06
  • 2019-01-05
  • 2011-11-08
  • 1970-01-01
相关资源
最近更新 更多