如何捕获带有或不带有扩展名的文件名

问题描述

我正在尝试捕获并替换一个文件名,例如 000035 ZSMS_1.mp3 还有一个像 000035 1OMNA (我基本上是想对它们重新排序,以便它们看起来像是ZSMS_1(000035).mp3)。 我尝试过

^(\d+) (.*)(\..*$)?
^(\d+) (.*?)(\..*$)?

我希望发生的事情: 000035 ZSMS_1.mp3:

[
  {
    "groups": [
        "000035","ZSMS_1",".mp3"
      ],"match": "000035 ZSMS_1.mp3"
  }
]

000035 1OMNA:

[
  {
    "groups": [
        "000035","1OMNA",""
      ],"match": "000035 1OMNA"
  }
]

会发生什么: 1。

^(\d+) (.*)(\..*$)?

000035 ZSMS_1.mp3:

[
  {
    "groups": [
        "000035","ZSMS_1.mp3","match": "000035 1OMNA"
  }
]
^(\d+) (.*?)(\..*$)?

000035 ZSMS_1.mp3:

[
  {
    "groups": [
        "000035","","match": "000035 "
  }
]

000035 1OMNA:

[
  {
    "groups": [
        "000035","match": "000035 "
  }
]

解决方法

您可以使用

^(\d+)\h+(.*?)(\.[^.]*)?$

请参见regex demo

详细信息

  • ^-字符串的开头
  • (\d+)-第1组:一个或多个数字
  • \h+-1个以上的水平空格(为了获得更好的正则表达式引擎交叉兼容性,您可以使用[^\S\r\n]+或仅使用[ \t]+来匹配制表符或空格)
  • (.*?)-第2组:零个或多个除换行符以外的字符,并且尽可能少
  • (\.[^.]*)?-一个可选的捕获组#3:一个点,然后尽可能多地添加.以外的0个或更多字符
  • $-字符串的结尾。
,

您可以尝试使用正则表达式:

^(\d+)\s*(?:(\w+)?)(?:(\.\w+)?)$

详细信息:

  • ^-行首
  • (\d+)-第1组:匹配一个数字
  • \s*-分隔组1和2
  • (?:(\w+)?)-第2组(可选):匹配任何文字字符
  • (?:(\.\w+)?)-第3组(可选):与字符匹配。还有任何文字字符
  • $-行尾

Demo

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...