Используйте -notmatch
(или, если требуется регистр * необходимо сопоставление, -cnotmatch
) - т. Е. a отрицание сопоставление - в сочетании с чередованием (|
):
PS> $string -notmatch '(^Get-|Linux)'
Put-WindowsDevel
Оператор -match
и его вариации (а также многие другие операторы) могут напрямую воздействовать на массивы как LHS, и в этом случае оператор действует как фильтр и возвращает только совпадающие элементы.
- Использование
-match
в массиве намного быстрее, чем использование Where-Object
командлета в конвейере для фильтрации.
Regex (^Get-|Linux)
соответствует либо Get-
в начале строки (^
) или (|
) подстроки Linux
в любом месте в строка.
Следовательно, это регулярное выражение соответствует строкам, которые вы не хотите, и, используя отрицательную форму -match
- -notmatch
- вы, следовательно, исключите те Строки, по желанию.
Если вы действительно хотите выразить свое регулярное выражение как положительное совпадение :
PS> $string -match '^(?!Get)((?!Linux).)*$'
Put-WindowsDevel
Обратите внимание, однако, что это регулярное выражение не только намного сложнее, но и будет работать хуже (хотя и незначительно).
Что касается , что вы пытались :
Часть .*(?!Linux)
вашего регулярного выражения, включающая отрицательное прогнозное утверждение ((?!...)
) - не эффективна для исключения строк, содержащих подстроку Linux
; e.g.:
PS> 'Linux' -match '.*(?!Linux)'
True # !!
Причина в том, что .*
соответствует всей строке, а , тогда смотрит вперед, чтобы увидеть, если Linux
нет - что, очевидно, верно в конце строки.
Чтобы эффективно исключить подстроку, утверждение должно применяться к каждому символу всей строки :
PS> '', 'inux', 'Linux', 'a Linux', 'aLinuxb' -match '^((?!Linux).)*$'
# '' (empty string) matched
inux # 'inux' matched
Обратите внимание, как 'Linux'
, 'a Linux'
и 'aLinuxb'
были правильно исключены.