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

How to capture a filename with or without an extension

我正在尝试捕获并替换文件名,例如 000035 ZSMS_1.mp3 还有一个像这样的文件 000035 1欧姆纳 (我基本上是在尝试重新排序它们,使它们看起来像 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 ZSMS_1.mp3"
  }
]

000035 1OMNA:

[
  {
    "groups": [
        "000035",
        "1OMNA",
        ""
      ],
    "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+ horizo​​ntal whitespaces(为了更好的正则表达式引擎 cross-compatibility,你可以使用 [^\S\r\n]+ 或者只是 [ \t]+ 来匹配选项卡或 space)
  • (.*?) - 第 2 组:除换行字符外的零个或多个字符,尽可能少
  • (\.[^.]*)? - 一个可选的捕获组 #3:一个点,然后是 . 以外的 0 个或更多字符,尽可能多
  • $ - 字符串结尾。

您可以尝试以下正则表达式:

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

详情:

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

Demo