【问题标题】:Apply a filter for string which contains given phrase and return everything which occurs after对包含给定短语的字符串应用过滤器并返回之后发生的所有内容
【发布时间】:2018-12-20 00:07:03
【问题描述】:

我想构建一个 PowerShell 脚本,它返回给定字符串出现后发生的所有内容。我想针对单个字符串而不是集合运行命令。

例如我想返回短语“_blah_”之后的所有内容

_blah_v2.3 
_blah_bar_blah_v56
_blah_v42 
foo

结果:

v2.3 
bar_blah_v56
v42 

可能正则表达式对于这样的操作来说太重了,所以寻找一些替代解决方案 我试过这个:

$Foo = "blah_v1.1"
$FooVersion = ($Foo -split '_blah_', 2)[1]

Write-Host $Foo
Write-Host $FooVersion

但它仅适用于单个字符而不是字符串。我不精通 PowerShell,正在寻找一些快速方便的解决方案。

【问题讨论】:

  • "_blah_bar_blah_v56" -replace "^.*?blah_"?或类似的东西。正则表达式似乎非常适合这样的事情。从字符串的开头替换,直到并包括“单词”
  • -split 命令的唯一问题(顺便说一句,它也使用正则表达式)是您只匹配_blah_,而输入只有blah_。跨度>

标签: powershell


【解决方案1】:

可能正则表达式对于这样的操作来说太重了

不,不会的。

"_blah_v2.3" -replace '^.*?_blah_'

【讨论】:

  • 如果不需要替换操作,则使用带有正向后视的匹配:(?<=blah_)
  • 使用-match 仍然需要第二次操作。替换...取决于它的使用方式...不会破坏任何东西。
【解决方案2】:

因此,带有给定短语的字符串与您的previous question 不同,但其余部分没有太大区别。

使用类似的东西

$FooVersion = $Foo -replace '_?blah_(.*)', '$1'

$FooVersion = ($Foo -split '_?blah_', 2)[-1]

if ($Foo -match '_?blah_(.*)') { $FooVersion = $Matches[1] } else { $FooVersion = $Foo }

会做的。

还请阅读mklement0给出的解释。这肯定会在未来的情况下有所帮助。

【讨论】:

    【解决方案3】:

    除非性能很关键(非常罕见),否则正则表达式很好。我会使用积极的向后看。请参见以下示例:

    $test = '_blah_v2.3 ','_blah_bar_blah_v56','blah_v42 ','foo'
    ($test | Select-String '(?<=blah_).*').Matches.Value
    

    请注意,我使用blah_ 作为分隔符。

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 2021-07-11
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2012-04-10
      • 2022-07-01
      相关资源
      最近更新 更多