【问题标题】:How do I escape Regex to search on a period?我如何逃避正则表达式来搜索一个时期?
【发布时间】:2013-06-21 20:37:54
【问题描述】:

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

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

【问题讨论】:

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

标签: regex powershell-2.0 regex-negation


【解决方案1】:

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

另外,值得注意的是:

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

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

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

[^\w.]

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      相关资源
      最近更新 更多