我正在构建一个文件列表,我将这些文件放入我的 $list 变量中。
然后我想根据 $filter 变量过滤列表。当前的解决方案有效,但不适用于正则表达式。
$filter = @("test.txt","Fake","AnotherFile\d{1..6}")
######### HTML TESTS #############
[string]$list = @"
FakeFile.txt
test120119.txt
AnotherFile120119.txt
LastFile.txt
"@
[array]$files = $list -split '\r?\n'
$files = $files | Where-Object {$_} | Where {$_ -notin $filter} # filter out empty items from the array...
$files
Run Code Online (Sandbox Code Playgroud)
我的想法是将正则表达式模式放在 $filter 变量中,这样我就可以捕获包含日期戳的文件名,例如test120119.txt上面的 $list 变量。
如何更改我的代码以允许使用正则表达式?我在不拆分 $list 的情况下尝试了 select-string 的一些变体,但效果不佳。我也尝试将我的更改-notin为 -notmatch 但这当然根本不起作用。
如果您想使用正则表达式,我认为将$filter数组完全提交到正则表达式会更容易。
$filter = "^test\d{0,6}\.txt","^Fake","^AnotherFile\d{0,6}\.txt" -join '|'
$list = @"
FakeFile.txt
test120119.txt
AnotherFile120119.txt
LastFile.txt
"@
$files = $list -split '\r?\n'
$files | Where {$_ -notmatch $filter}
Run Code Online (Sandbox Code Playgroud)
要记住的事情是记住要转义特殊的正则表达式字符,如果您希望按字面意思处理它们。您可以使用该[regex]::Escape()方法为您执行此操作,但如果您已经故意注入正则表达式字符,则不能使用该方法。
拥有正则表达式过滤器列表后,您可以or使用|字符将每个项目与正则表达式连接起来。
并非所有运算符都能识别正则表达式语言。-match并且-notmatch是少数这样做的。-match并且-notmatch不区分大小写。如果要匹配大小写,则应使用-c运算符的变体,即-cmatch和-cnotmatch。
可以根据自己的喜好调整正则表达式项。需要给出更多要求才能提出准确的解决方案。以下是一些需要考虑的示例:
\d{0,6}匹配 0 到 6 个连续数字。122619将成功匹配,但也会成功1226。如果您只想匹配 0 或 6 位数字,则可以使用(\d{6})?.^如果您想在输入字符串的开头开始每个匹配项,则应该使用它。因此,如果您希望正则表达式or从字符串的开头开始应用,您需要^在每个项目或组项目中^包含()相应的首字母。^item1|^item2将返回与^(item1|item2).\转义文字.字符。^,会$产生很大的灵活性和可能不需要的结果。'FakeFile' -match 'Fake'返回 true 但也是如此'MyFakeFile' -match 'Fake'。但是,'MyFakeFile' -match 'Fake$'返回 false 并'MyFake' -match 'Fake$'返回 true。| 归档时间: |
|
| 查看次数: |
1720 次 |
| 最近记录: |