【问题标题】:Extract dynamic string with regex (PowerShell)使用正则表达式提取动态字符串 (PowerShell)
【发布时间】:2023-02-08 03:44:43
【问题描述】:

我在 PowerShell 中有一个包含所有复杂字符的长输出字符串

这是其中的一部分:

{host-up|rp-web1|/images/logos/Generic_Host.gif|0|276|0 关键服务关键|rp-web1|ssl_expiration_bitwarden|26186|0|0|1|0 2023/02/06 .. ..

“服务关键”是一个固定的字符串,在字符串中多次出现

“rp-web1|ssl_expiration_bitwarden”- 这是一个紧跟在“service-critical”之后的动态字符串

我无法编写一个正则表达式来提取文本中的所有动态字符串

当然,我尝试在动态字符串之间使用 3 个管道,但没有成功

我希望在“服务关键”之后获得所有动态字符串,例如:

rp-web1|ssl_expiration_bitwarden

【问题讨论】:

  • “我当然试过了......” - 请发布你正在使用的实际代码,而不是说明您正在使用的代码:)
  • 这是所有发布答案的用户都同意的罕见情况之一错误的答案是目前公认的。请考虑相应地更改您的投票,尤其是为了未来读者的利益。

标签: regex powershell extract powershell-4.0


【解决方案1】:

你可以试试这个:

(?:service-critical|)K(.*?|.*?)(?=|)

Here is a demo

  • (?:service-critical|) - 查找 service-critial| 短语但不对其进行分组
  • K - 省略找到的service-critial| 的匹配,因为这是您不想在结果中看到的部分注意:正如@mklement0 指出的那样,它在 .NET 正则表达式引擎(由 powershell 使用)中不起作用。在这种情况下,您可以跳过它并与 service-critical| 短语匹配或使用 @mklement0 答案中显示的正后向结构
  • (.*?|.*?) - 捕获一组任意字符(或根本没有字符,以非贪婪方式由单个| 分隔
  • (?=|) - 确保它后面跟着|(它被称为正向先行)

【讨论】:

  • @yishai 请更正正确答案的标记
【解决方案2】:

使用.NET[regex]::Matches()方法提取全部给定正则表达式的所需匹配项。

# Sample input string with 2 "service-critical" groups.
$str=@'
{host-up|...|0 CRITICAL service-critical|rp-web1|ssl_expiration_bitwarden1|26186|0|0|1|0 2023/02/06 ....
{host-up|...|0 CRITICAL service-critical|rp-web2|ssl_expiration_bitwarden2|26186|0|0|1|0 2023/02/06 ....
'@

# Define the regex.
$regex = '(?<=service-critical|)[^|]+|[^|]+'

# Find and report all matches
# -> 'rp-web1|ssl_expiration_bitwarden1', 'rp-web2|ssl_expiration_bitwarden2'
[regex]::Matches($str, $regex).Value

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 2016-01-02
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多