regex - 仅将文件的基本名称(不带扩展名的文件名)与正则表达式匹配
问题描述
在 PowerShell 中,我想比较文件名。该文件的名称为someFileName.docx。我正在使用以下 cmdlet:
$tmpTarget["Name"] -match $name
有时$tmpTarget["Name"]
有文件扩展名,有时没有。
-match
所以我想要一个只有文件名但忽略扩展名的正则表达式。
谢谢
解决方案
如果您只想匹配基本名称(没有扩展名的文件名),首先使用并匹配结果更简单:[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 个扩展名,例如someFileName
或someFileName.docx
.
如果您的文件名可能有多个扩展名,例如someFileName.foo.docx
,并且您只想忽略最后一个扩展名,则需要做更多的工作:
PS> 'someFileName.bar.docx' -match '^someFileName\.foo(?:\.[^.]*$|$)'
True # 'someFileName.foo' matches in full, because only .docx is ignored.
- 子表达式
\.[^.]*$
仅匹配最后一个扩展名:文字.
(\.
) 后跟( )以外的内容零次或多次 ( )到字符串 ( ) 的末尾。.
[^.]
*
$
推荐阅读
- python - Pygame枪在左侧问题上向上旋转视线
- java - 线程“主”java.lang.IllegalStateException 中的异常:无法转换具有名称的类
- c# - MongoDB 仅限儿童搜索
- java - 将列表推送到新活动的更好方法?
- gitlab - 从 dev [gitlab] 创建一个新分支
- javascript - 也许你只是知道是什么让这个循环上的星号如此之多
- javascript - TestCafe 条件 if else web 元素如果第一个失败,如何继续下一个条件
- tensorflow - Google colab 未在完整数据集下进行训练
- google-app-engine - GAE/Jenkins - cloudbuild 服务帐户无权访问 projectID
- node.js - 每当我运行 Node JS 服务器时,如何打开两个 html 页面?