【问题标题】:Get Filname without extension from string with regex使用正则表达式从字符串中获取不带扩展名的文件名
【发布时间】:2013-03-05 15:31:32
【问题描述】:

我有一个包含文件 URL 的字符串。我想从那个字符串中获取不带扩展名的文件名。

例如:

http://path/Lists/Test/Attachments/1/Document Test.docx

从那个例子我想回来:Document Test

我已经有了以下模式:

(?<=\/)(\w+)(?=\.\w+(\?.*)*$)

但如果文件名包含空格,它就不起作用...如何更改这种模式以使其更灵活?

【问题讨论】:

  • 看看String类中的substringlastIndexOf
  • 您使用哪种语言?根据您选择的语言,有许多更快、更高效的选项。
  • java 类库可能有正则表达式的替代品!

标签: java regex filenames extraction


【解决方案1】:

要仅捕获扩展名之前的字符(不限制文件名可能包含的字符),请使用以下命令:

/[^/]*(?=\.[^.]+($|\?))/

【讨论】:

  • 非常感谢,这对我很有用。但我现在需要文件名+扩展名。所以我现在使用以下模式来删除 filename.ext 之前的所有内容:.*/
  • 第二个反斜杠会导致 PHP 出现问题。我不得不逃避它,所以:/[^\/]*(?=\.[^.]+($|\?))/
【解决方案2】:

非必要时不要使用正则表达式。在这种情况下,lastIndexOF /. 之间的子字符串会给你你想要的。

String data = "Document Testdocx";

int start = data.lastIndexOf('/')+1;
int end = data.lastIndexOf('.');
if (end == -1) end = data.length();

System.out.println(data.substring(start , end));

但如果你真的必须使用正则表达式,你可以试试这个模式:(?&lt;=/|^)[^./]+(?=\\.\\w+$|$)

【讨论】:

  • 真的吗?哪个更高效?
  • @Kata 在大多数情况下,正则表达式比简单的解决方案要慢。
【解决方案3】:

试试

    String s = "http://path/Lists/Test/Attachments/1/Document Test.docx";
    s = s.replaceAll(".+/(.+)\\..+", "$1");
    System.out.println(s);

输出

Document Test

【讨论】:

    【解决方案4】:
    ([^?]+)\/([^/?]+)(\.[^.\?]+)(\?.*|)$
    

    即使网址看起来像

    http://example.com/foo/bar/baz blah.html?params=true
    

    这可以找到文件名(不包括目录)和扩展名。

    最好用java.net.URL 解析URL,然后使用URL.getPath()。

    【讨论】:

    • +1 用于提及 java.net.URL 类。如果您包含一个示例,您的答案将进一步改进。
    【解决方案5】:

    试试(.+?)(\.[^.]*$|$),而不是(?&lt;=/)(\w+)(?=.\w+(\?.)$)

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2020-03-11
      • 1970-01-01
      • 2013-03-18
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多