有一个简单的任务,一直在弄乱我,我需要另外几组眼睛。我确定我错过了一些简单的事情。我们有一个包含各种特殊字符的文件目录,我需要删除那些只留下字母,数字,点(句点)和下划线字符的文件。我在PowerShell v2.0脚本中使用正则表达式。
例如:
!foo12.log
变为foo12.log
foo1(bar)2.log
变为foo1bar2.log
[foo]bar_.log
变为foobar_.log
我的策略是使用和排除列表,并用""
替换其他所有内容。考虑:
$bkpPath = "\\Server\foo"
gci $bkpPath | % {$_.name -replace "[^a-zA-z_0-9]",""}
当我运行此操作时,我最终得到foo12log
,foo1bar2log
和foobar_log
,因此我将正则表达式更改为包含.
:[^a-zA-Z_\.0-9]
。这不会删除任何特殊字符。我也尝试了[^a-zA-Z_\[\]\(\)\.0-9]
,结果与我逃避一段时间相同。
我怀疑我逃到期间\.
存在问题,正则表达式将其作为通配符读取。如果这是正在发生的事情,我该如何解决?如果那不是正在发生的事情,我错过了什么?
答案 0 :(得分:1)
您不需要在字符类中转义句点:
[^a-zA-Z_.0-9]
应该可以正常工作。如果没有,那么powershell regex风味可能会有一些特别之处。
答案 1 :(得分:1)
因为“。”意思是“任何东西”,在方括号内使用那个特殊字符会很愚蠢。所以在这种情况下,句号失去了它的特殊含义,你不必在它之前使用“\”转义字符。
另外,值得注意的是:
\ w表示“任何单词字符”(字母,数字,下划线)
\ W表示“任何非单词字符”(虽然在这种情况下这不是节省时间,因为您也希望匹配句点。)
所以在这种情况下,正则表达式的相关位可能只是:
[^ \瓦特]