首页 > 解决方案 > 仅将文件的基本名称(不带扩展名的文件名)与正则表达式匹配

问题描述

在 PowerShell 中,我想比较文件名。该文件的名称为someFileName.docx。我正在使用以下 cmdlet:

$tmpTarget["Name"] -match $name

有时$tmpTarget["Name"]有文件扩展名,有时没有。

-match所以我想要一个只有文件名但忽略扩展名的正则表达式。

谢谢

标签: regexpowershell

解决方案


如果您只想匹配基本名称(没有扩展名的文件名),首先使用并匹配结果更简单:[IO.Path]::GetFileNameWithoutExtension()

[IO.Path]::GetFileNameWithoutExtension($tmpTarget["Name"]) -match '^someFileName$'

请注意,示例文件名使用(字符串开头)和(字符串结尾)someFileName锚定,因为默认情况下执行子字符串匹配。^$-match

当然someFileName,从字面上看,完全匹配-eq 'someFileName'就可以了。

PowerShell Core(但不在 Windows PowerShell)中,您也可以使用
Split-Path -LeafBase

# PowerShell *Core* only.
PS> Split-Path -LeafBase 'someFileName.docx'
someFileName

如果您确实想使用单个正则表达式,则可以使用以下内容,但它要复杂得多:

$tmpTarget["Name"] -match '^someFileName(?:\.|$)'
  • (?:...)是一个非捕获子表达式

  • \.|$要么匹配文字.( \.) - 扩展的开头 - 或 ( |) 字符串的结尾 ( $) - 如果没有扩展。

如果您的文件名最多只有1 个扩展名,例如someFileNamesomeFileName.docx.


如果您的文件名可能有多个扩展名,例如someFileName.foo.docx,并且您只想忽略最后一个扩展名,则需要做更多的工作:

PS> 'someFileName.bar.docx' -match '^someFileName\.foo(?:\.[^.]*$|$)'
True # 'someFileName.foo' matches in full, because only .docx is ignored.
  • 子表达式\.[^.]*$仅匹配最后一个扩展名:文字.( \.) 后跟( )以外的内容零次或多次 ( )到字符串 ( ) 的末尾。.[^.]*$

推荐阅读