如何逃避正则表达式搜索一段时间?

时间:2013-06-21 11:55:42

标签: regex powershell-v2.0 regex-negation

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

应该可以正常工作。如果没有,那么powershell regex风味可能会有一些特别之处。

答案 1 :(得分:1)

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

另外,值得注意的是:

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

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

所以在这种情况下,正则表达式的相关位可能只是:

[^ \瓦特]