1

有一个简单的任务一直困扰着我,我需要另外几双眼睛。我确定我错过了一些简单的东西。我们有一个包含各种特殊字符的文件目录,我需要删除那些只留下字母、数字、点(句点)和下划线字符。我在 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]",""}

当我运行它时,我最终得到了foo12logfoo1bar2log因此foobar_log我将正则表达式更改为包含.: [^a-zA-Z_\.0-9]。这不会删除任何特殊字符。我也尝试过[^a-zA-Z_\[\]\(\)\.0-9]与逃避一段时间时相同的结果。

我怀疑我逃到那个时期存在问题,\.并且正则表达式将它作为通配符读取。如果这是怎么回事,我该如何解决?如果这不是发生了什么,我错过了什么?

4

2 回答 2

2

因为 ”。” 表示“任何东西”,在方括号内使用该特殊字符会很愚蠢。所以在这种情况下,句号失去了它的特殊含义,你不必在它之前使用“\”转义字符。

此外,值得注意的是:

\w 表示“任何单词字符”(字母、数字、下划线)

\W 表示“任何非单词字符”(尽管在这种情况下这不是节省时间,因为您也想匹配句号。)

因此,在这种情况下,您的相关正则表达式可能只是:

[^\w.]

于 2013-06-21T12:37:54.390 回答
1

您不需要在字符类中转义句点:

[^a-zA-Z_.0-9]

应该可以正常工作。如果不是,则 powershell 正则表达式可能有些特别之处。

于 2013-06-21T12:15:50.530 回答