Совпадение нескольких условий в регулярном выражении powershell - PullRequest
2 голосов
/ 26 апреля 2019

В powershell мне нужно перебрать и вернуть список всех уникальных первых элементов (до первого ::), которые начинаются с puppet_, например. puppet_customer и puppet_edcs. Если возможно, исключите некоторые из списка puppet_, такие как puppet_enterprise и puppet_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

$invoke.name | Select-String -Pattern ^puppet_.*\:\:'(\w+)'\:\:'(\w+)'$ | 
    foreach {$_.Matches.Groups[1].Value} | Sort-Object | Unique`

Ответы [ 4 ]

3 голосов
/ 27 апреля 2019

Вы можете использовать

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

См. Демоверсию regex .Он будет соответствовать puppet_ в начале строки, за которой сразу не следует enterprise, metrics_collector, agent, testing, и затем будет использовано 1 или более слов с символами:

enter image description here

Обратите внимание, что вам необходимо получить доступ к полному значению совпадения , а не к значению группы захвата, т.е. $_.Matches.Value в этом случае.

Если вы хотите избежать совпадения только в том случае, если за словами «стоп» следуют ::, настройте шаблон следующим образом:

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

См. regex demo .

1 голос
/ 26 апреля 2019

Полезный ответ Wiktor Stribiżew решает вашу проблему, предоставляя необходимое регулярное выражение, которое включает в себя отрицательное утверждение ((?!...)).

Этот ответ показывает вам альтернативу, которая позволяет избежать сложности требуемого регулярного выражения.


PowerShell имеет много гибких командлетов и строковых операторов, и хотя их объединение в конвейер может оказаться не самым быстрым вариантом, оно допускает концептуально простые решения:

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

Примечание. Вышеприведенное предполагает, что в любой данной строке :: -разделенные токены, начинающиеся с puppet_, встречаются только как первый токен в этой строке, если таковой имеется; если это предположение не выполняется, требуется дополнительная работа.

0 голосов
/ 28 апреля 2019

попробуйте это:

$yourlist | where {$_ -like "puppet_*" -and $_ -notlike '*puppet_enterprise*'  -and $_ -notlike '*puppet_metrics_collector*' -and $_ -notlike '*puppet_agent*' } | 
    %{($_ -split "::")[0]} | sort -Unique
0 голосов
/ 26 апреля 2019

А как же:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...