在Powershell正则表达式中匹配多个条件

时间:2019-04-26 19:40:46

标签: regex powershell

在powershell中,我需要遍历并返回以user1开头的所有唯一的第一个元素的列表(在第一个::之前)。 puppet_puppet_customer。如果可能,请从puppet_列表中排除某些内容,例如puppet_edcspuppet_enterprisepuppet_metrics_collector

puppet_agent

这是我希望它返回的列表

chocolatey
pe_install::install
pe_postgresql::lib::devel
profile::agent_config
puppet_agent::install::remove_packages
puppet_customer::customer_shared::alerts
puppet_customer::email_shared::email
puppet_edcs::claims::grt_api
puppet_enterprise::certs::puppetdb_whitelist
puppet_ets::windows::defaults::audit_policy
puppet_metrics_collector
puppet_policyservicing::owbinet::file_cluster
puppet_printserver::print
puppet_product::avrt::avrt
puppet_quoting::aqw_dca::aqw
puppet_testing::ourtestfile
puppet_webpresence::lifelanes_webapp
role::customer::customer_shared

puppet_customer
puppet_edcs
puppet_ets
puppet_policyservicing
puppet_printserver
puppet_product
puppet_quoting
puppet_webpresence

4 个答案:

答案 0 :(得分:2)

您可以使用

'^puppet_(?!enterprise|metrics_collector|agent|testing)\w+'

请参见regex demo。它会在行的开头与puppet_匹配,但不会立即跟在enterprisemetrics_collectoragenttesting之后,然后是1个或多个单词字符将被消耗:

enter image description here

请注意,您需要访问完全匹配值,而不是捕获组值,在这种情况下,即访问$_.Matches.Value

如果您只想避免匹配,请在{stop}后面加上::来调整模式,例如

^puppet_(?!(?:enterprise|metrics_collector|agent|testing)::)\w+
           ^^^                                          ^^^

请参阅此regex demo

答案 1 :(得分:1)

Wiktor Stribiżew's helpful answer通过提供必需的正则表达式解决了您的问题,该正则表达式涉及否定超前断言((?!...))。

此答案为您显示了避免所需正则表达式复杂的替代方法。


PowerShell具有许多灵活的cmdlet和字符串运算符,虽然通过管道链接它们可能不是最快的选择,但它允许使用概念上简单的解决方案:

$invoke.name -split '::' -like 'puppet_*' |
  Sort-Object -Unique |
   Where { $_ -notin 'puppet_enterprise', 'puppet_metrics_collector', 'puppet_agent'}

注意:以上假设在任何给定行中,以::开头的puppet_分隔的令牌仅以该行的 first 令牌出现,如果有的话;如果该假设不成立,则需要做更多的工作。

答案 2 :(得分:0)

尝试一下:

$yourlist | where {$_ -like "puppet_*" -and $_ -notlike '*puppet_enterprise*'  -and $_ -notlike '*puppet_metrics_collector*' -and $_ -notlike '*puppet_agent*' } | 
    %{($_ -split "::")[0]} | sort -Unique

答案 3 :(得分:-1)

那又怎么样:

puppet_(?!enterprise|metrics_collector|agent|testing)(.*?)::

https://regex101.com/r/gQ1yF5/2