首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerShell Regex忽略,直到字符串匹配,包括字符串匹配

PowerShell Regex忽略,直到字符串匹配,包括字符串匹配
EN

Stack Overflow用户
提问于 2020-06-18 15:30:00
回答 1查看 992关注 0票数 1

我试图读取一个文件,并忽略所有直到字符匹配。有时,字符匹配将显示在与我需要的结果相同的行上,因此我无法执行Select-Object -Skip x,其中x是从文档返回的行数。

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

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

我正在查看this answer,并认为可以使用/.+?(?=abc)/替换如下的搜索字符串:

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

那也没用。在寻找匹配(比如{\d\d\d} )以确保它有3位长时,我对regex没有意见,但是我不知道如何在这个实例中使用它。

这是返回文件的开始。我需要忽略所有的东西,直到包括字符<pre>,然后再到文件末尾的任何内容都可以。

在这里返回示例命令和结果:

代码语言:javascript
复制
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

编辑:

我现在有了它,它删除了直到第一个<pre>标记的所有内容,还删除了关闭的</pre>标记,但是在关闭</pre>标记之后不会删除任何东西。

代码语言:javascript
复制
(Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?<pre>' -replace '<\/pre>(.+?)'

可以扩展到包含到文件的末尾吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-19 09:30:24

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

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

你需要用

代码语言:javascript
复制
(Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?<pre>(.*?)</pre>.*', '$1'

它将获取整个文件内容,并获取第一个<pre>字符串和最近的</pre>之间的文本内容。

模式细节

  • (?s) -一个使.匹配换行符的RegexOptions.Singleline内联修饰符,too
  • ^ - string
  • .*?的开始-任何零或多个字符尽可能少到possible
  • <pre> -一个<pre> text
  • (.*?) -捕获组#1:任何零或多个字符尽可能少的possible
  • </pre> - </pre> text
  • .* -任何零或多个字符尽可能多(因为*是一个贪婪的quantifier).

)

替换模式中的$1将恢复结果中的Group 1值(因此,它将保持不变)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62453630

复制
相关文章

相似问题

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