сопоставить массив с несколькими регулярными выражениями (из массива) - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть массив со строками, скажем,

$data = @(
"Haus",
"Maus",
"Laus",
"Schnitzel",
"Elefant"
)

Я хочу проверить его по нескольким регулярным выражениям из массива.

$regexChecks = @(
".*aus.*",
".*fant.*"
)

Я пробовал что-то подобное

$test = $data |? {$regexChecks -notmatch $_}

Write-Host $test

Я ожидаю только строку "Шницель" в качестве вывода.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Совпадения с регулярными выражениями - это гораздо более медленные операции, чем буквальные сравнения (-eq) или даже совпадения с подстановочными знаками (-like), поэтому вам следует максимально сократить количество сравнений.Так как у вас есть массив регулярных выражений, вы можете просто объединить их в одно:специальные символы, такие как точки, квадратные скобки и т. д.):

$re = ($regexChecks | ForEach-Object {[regex]::Escape($_)}) -join '|'

Кроме того, вам не нужно добавлять начальные и конечные символы .* в выражения, поскольку регулярные выражения по умолчанию не привязываются.Просто опустите их.

$regexChecks = 'aus', 'fant'
$re = ($regexChecks | ForEach-Object {[regex]::Escape($_)}) -join '|'

Вам также не нужны Where-Object или ForEach-Object для перечисления элементов массива, потому что операторы PowerShell работают как сами перечислители.Просто используйте оператор для массива напрямую:

$test = $data -match $re
0 голосов
/ 11 декабря 2018

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

$data = @(
"Haus",
"Maus",
"Laus",
"Schnitzel",
"Elefant"
)

$Regex = '.*Schnitzel.*'

$test = $data | ? { $_ -match $Regex }

Write-Host $test

, если вы хотите проверить более одного регулярного выражения, используйте | для их разделения

Это приведет к выводу Schnitzel и Maus

$Regex = '.*Schnitzel.*|.*Maus.*'

Это вернет Schnitzel, Maus, Laus и Haus

$Regex = '.*Schnitzel.*|.*aus.*'

РЕДАКТИРОВАТЬ :

Вытакже может иметь массив регулярных выражений и объединять их с помощью |:

$RegexArray = @(
    '.*Schnitzel.*',
    '.*Maus.*'
)

$Regex = $RegexArray -join '|'

$test = $data | ? { $_ -match $Regex }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...