Regex 如何在句点上逃出正则表达式进行搜索?

Regex 如何在句点上逃出正则表达式进行搜索?,regex,powershell-2.0,regex-negation,Regex,Powershell 2.0,Regex Negation,有一个简单的任务一直困扰着我,我还需要几双眼睛。我肯定我错过了一些简单的东西。我们有一个包含各种特殊字符的文件目录,我需要去掉它们,只留下字母、数字、点(句点)和下划线字符。我正在PowerShell v2.0脚本中使用正则表达式 例如: !foo12.log变为foo12.log foo1(bar)2.log变成foo1bar2.log [foo]bar.log变成foobar.log 我的策略是使用和排除列表,并用“替换所有其他内容。考虑: $bkpPath = "\\Server\foo"

有一个简单的任务一直困扰着我,我还需要几双眼睛。我肯定我错过了一些简单的东西。我们有一个包含各种特殊字符的文件目录,我需要去掉它们,只留下字母、数字、点(句点)和下划线字符。我正在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\u log
,因此我将正则表达式更改为包含
[^a-zA-Z\.0-9]
。这不会删除任何特殊字符。我还尝试了
[^a-zA-Z\[\]\(\)\.0-9]
,结果与我逃出句点时的结果相同


我怀疑我的转义到
\.
期间有问题。并且regex将其作为通配符读取。如果是这样的话,我该怎么解决呢?如果不是这样,我缺少什么?

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

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

应该行得通。如果没有,则powershell正则表达式可能有一些特别之处。

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

[^a-zA-Z_.0-9]
应该行得通。如果没有,那么powershell正则表达式的味道可能会有些特别。

因为“.”表示“任何东西”,在方括号内使用该特殊字符将是愚蠢的。因此,在本例中,句号失去了它的特殊含义,您不必在它前面使用“\”转义字符

此外,值得注意的是:

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

\W表示“任何非单词字符”(尽管在本例中这并不是一个节省时间的方法,因为您也希望匹配句号)

因此,在本例中,您的相关正则表达式位可能是:

[^\w.]

因为“.”表示“任何东西”,所以在方括号内使用那个特殊字符是愚蠢的。因此,在本例中,句号失去了它的特殊含义,您不必在它前面使用“\”转义字符

此外,值得注意的是:

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

\W表示“任何非单词字符”(尽管在本例中这并不是一个节省时间的方法,因为您也希望匹配句号)

因此,在本例中,您的相关正则表达式位可能是:


[^\w.]

你试过
[^a-zA-Z.0-9]
吗?你试过
[^a-zA-Z.0-9]
吗?