首页 > 解决方案 > 如何捕获带或不带扩展名的文件名

问题描述

我正在尝试捕获和替换像 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 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 "
  }
]

标签: regexpcreregex-groupregex-greedy

解决方案


您可以使用

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

查看正则表达式演示

细节

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

推荐阅读