如何使用正则表达式获取不带扩展名的文件名?
匹配不带扩展名的特定文件名(适配GitHub Actions)
问题说明
需要匹配并提取不带扩展名的特定文件名,测试样本包括:
- Test App 0.2.1.exe
- dsdsad
- Test App 0.2.1.dmg
- Test App 0.2.1
此前尝试正则^\S+\.(?:dmg)$匹配失败,目标是提取出Test App 0.2.1这类主文件名,最终将结果存入GitHub Actions变量,使用工具为actions-ecosystem-action-regex-match。
问题分析
你之前用的正则有两个核心问题:
\S仅匹配非空白字符,而目标文件名包含空格,导致匹配直接中断;- 该正则仅能匹配带
.dmg扩展名的文件,无法处理无扩展名或带其他指定扩展名(如.exe)的场景。
解决方案
正则表达式
根据需求,推荐使用以下正则(支持匹配无扩展名、.dmg、.exe结尾的文件名,精准提取主文件名):
^(.+?)(?:\.(?:dmg|exe))?$
各部分含义:
^锚定字符串开头(.+?)非贪婪捕获任意字符(包含空格),这部分就是我们需要的主文件名(?:\.(?:dmg|exe))?可选匹配.dmg或.exe扩展名,?:表示非捕获组(不保留扩展名部分),?表示该扩展名部分可省略$锚定字符串结尾
如果只需要处理.dmg扩展名的场景,可简化为:
^(.+?)(?:\.dmg)?$
GitHub Actions配置示例
结合actions-ecosystem-action-regex-match的实际配置如下:
- name: 提取不带扩展名的文件名 uses: actions-ecosystem/action-regex-match@v2 id: extract-filename with: text: ${{ steps.generate-filename.outputs.file-name }} # 替换为实际的文件名变量 regex: '^(.+?)(?:\.(?:dmg|exe))?$' - name: 使用提取后的文件名 run: echo "提取到的文件名:${{ steps.extract-filename.outputs.group1 }}"
通过steps.extract-filename.outputs.group1即可直接获取捕获到的主文件名。
测试验证
针对所有测试样本的提取结果:
Test App 0.2.1.exe→Test App 0.2.1dsdsad→dsdsadTest App 0.2.1.dmg→Test App 0.2.1Test App 0.2.1→Test App 0.2.1
内容的提问来源于stack exchange,提问作者user16891224
相关产品推荐
相关产品推荐

