【问题标题】:How to capture a filename with or without an extension如何捕获带或不带扩展名的文件名
【发布时间】:2020-08-21 11:28:12
【问题描述】:

我正在尝试捕获和替换文件名,例如 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 "
  }
]

【问题讨论】:

  • 第二种模式适用于您的示例数据。您需要 $2($1)$3 替换。 regex101.com/r/ynJ0ow/1
  • 糟糕,原来是错字,实际的模式是^(\d+) (.*?)(\..*$)?但是将 $ 放在最后确实可以很好地工作。谢谢,没想到这样做。 :)
  • 如果字符串包含多个点,只需将$ 放在^(\d+) (.*?)(\..*$)? might not do what you need 的末尾即可。我的解决方案will cope with that.
  • @Wiktor Stribiżew 哇,你是对的。感谢您的警告。

标签: regex pcre regex-group regex-greedy


【解决方案1】:

你可以使用

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

regex demo

详情

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

【讨论】:

    【解决方案2】:

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

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

    详情:

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

    Demo

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 2011-10-02
      • 2015-05-13
      • 1970-01-01
      • 2012-03-01
      • 2015-03-11
      • 2020-03-11
      • 2011-05-25
      • 2015-05-20
      相关资源
      最近更新 更多