Java提取子字符串

Java提取子字符串,java,pattern-matching,Java,Pattern Matching,我有几个文件,比如 “reportD05S01.xml”、“2018.annualD01S02.pdf”, “2018.05.monthlyD01S03.pdf”等 如何只提取每个文件的前几个部分,比如在“reportD05S01.xml”中,我只想获取“report”,在“2018.annualD01S02.pdf”中,只提取“2018.annual”等等。所以基本上,D[some_number]S[some_number].[扩展]正在被抛弃 这些文件位于目录中,我使用以下代码获取列表: F

我有几个文件,比如

“reportD05S01.xml”、“2018.annualD01S02.pdf”, “2018.05.monthlyD01S03.pdf”等

如何只提取每个文件的前几个部分,比如在“reportD05S01.xml”中,我只想获取“report”,在“2018.annualD01S02.pdf”中,只提取“2018.annual”等等。所以基本上,D[some_number]S[some_number].[扩展]正在被抛弃

这些文件位于目录中,我使用以下代码获取列表:

File dir = new File("/home/buddika/Inventory_Sales/Reports/");
File[] content = dir.listFiles();
并使用for循环遍历“content”数组。 我尝试了以下javascript链接中可用的方法,但没有成功

Pattern pattern = Pattern.compile("/^(\\[.+\\])?(.+[^a-z0-9])(?=D\\d)", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(name);
如何使用Java使之成为可能? 任何帮助都将不胜感激

我当前的代码看起来像

File dir = new File("/home/buddika/Inventory_Sales/Reports/");
File[] content = dir.listFiles();

   for(int i=0; i<content.length; i++){
    String name = content[i].getName();

    // extracting everything before department and section
    Pattern pattern = Pattern.compile("(.*?)D\\d+S\\d+\\.[^.]*", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(name);

    if(matcher.matches()){
        System.out.println(matcher.group(1));
    }           
   }
File dir=新文件(“/home/buddika/Inventory\u Sales/Reports/”;
File[]content=dir.listFiles();
对于(int i=0;i您可以使用

^(.*)D\d+S\d+\.[^.]*$

详细信息

  • ^
    -字符串的开头
  • (.*)
    -第1组:除换行符以外的任何0+字符,尽可能多
  • D\D+
    -
    D
    和一个或多个数字
  • S\d+
    -
    S
    和一个或多个数字
  • \。
    -一个点
  • [^.]*
    -0+字符,而非
  • $
    -字符串结束
以下是您可以在代码中使用它的方式:

Pattern pattern = Pattern.compile("(.*)D\\d+S\\d+\\.[^.]*", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(name);

if(matcher.matches()){
    System.out.println(matcher.group(1));
}

我不是正则表达式专家,但我使用了我在网上找到的以下代码,从完整文件名中提取名称和扩展名:

String fullName = "2018.annualD01S02.pdf";
String name = fullName.split("\\.(?=[^\\.]+$)")[0];
System.out.println(name);
印刷品

2018.annualD01S02

拆分的第二项是扩展名

不要在Java正则表达式中使用正则分隔符。不区分大小写是使用模式中的
(?i)
或使用
模式设置的。不区分大小写
选项(您已经在做的事情)。感谢Wiktor,这非常有用!我将修改代码。请尝试
“(.*D\\D+S\\D+\\.[^.]*”
并在
matcher.matches()之后抓取
matcher.group(1)
。@WiktorStribiżew非常感谢!@PushpeshKumarRajwanshi也感谢您!