我们如何删除网址中的日期和小时数?

时间:2017-05-04 13:01:02

标签: java sql

目前,我使用java从列表中获取以下所有URL。

1. Input - /folder1/folder2/folder3/folder4/folder5/dt=2017-10-05/hour=00/
2. Input - /folder1/folder2/folder3/folder4/folder5/dt=2017-10-05/
3. Input - /folder1/folder2/folder3/folder4/folder5/done_dt=2017-10-05.lst
4. Input - /folder1/folder2/folder3/folder4/folder5/20171005/00/
5. Input - /folder1/folder2/folder3/folder4/folder5/20171005/
6. Input - hdfs://location-one/mnt/hadoop/abc/cded/2017-10-05/
7. Input - /folder1/folder2/folder3/folder4/folder5/folder6/20171005/
8. Input - /folder1/folder2/folder3/folder4/folder5/dt=2017-10-05/hour=00/_done
9. Input - /folder1/folder2/folder3/folder4/folder5/

如何删除日期,小时数,如果它出现,最后将此值传递给数据库以完全匹配。

必需的输出是:

1. Input - /folder1/folder2/folder3/folder4/folder5/
2. Input - /folder1/folder2/folder3/folder4/folder5/
3. Input - /folder1/folder2/folder3/folder4/folder5/
4. Input - /folder1/folder2/folder3/folder4/folder5/
5. Input - /folder1/folder2/folder3/folder4/folder5/
6. Input - hdfs://location-one/mnt/hadoop/abc/cded/
7. Input - /folder1/folder2/folder3/folder4/folder5/folder6/
8. Input - /folder1/folder2/folder3/folder4/folder5/
9. Input - /folder1/folder2/folder3/folder4/folder5/

我的代码:

String rawDataPath= Input.replaceAll("\\d{4}-\\d{2}-\\d{2}/", "");
System.out.println("rawDataPath: " +rawDataPath);

如果日期不存在则失败。

2 个答案:

答案 0 :(得分:1)

这里:

public static void main(String[] args) {
  List<String> examples = Arrays.asList(
   "1. Input - /folder1/folder2/folder3/folder4/folder5/dt=2017-10-05/hour=00/",
   "9. Input - /folder1/folder2/folder3/folder4/folder5/");
 for (String input : examples) {
   System.out.println(input.replaceAll("dt=\\d{4}-\\d{2}-\\d{2}/hour=\\d{2}/", ""));
  }
}

打印

  
      
  1. 输入 - / folder1 / folder2 / folder3 / folder4 / folder5 /
  2.   
  3. 输入 - / folder1 / folder2 / folder3 / folder4 / folder5 /
  4.   

请注意:我只是增强您的正则表达式,以匹配该时间戳内容的“全部”。正如你所看到的那样:对于没有时间戳的行也能很好地工作。因为replaceAll()仅替换匹配。没有比赛,没有替补。

答案 1 :(得分:1)

您的正则表达式模式替换不充分。鉴于您的样品,它应该是:

String rawDataPath = 
  Input.replaceAll(
    "/((((done_)?dt=)?(\\d{4}-\\d{2}-\\d{2}|\\d{8})(\\.[^/]+)?)|((hour=)?\\d{2}))(?=(/|$))|(?<=/)_done(?=$)"
  , "");

这样可以消除所有样品的日期和小时数,同时保留各自的剩余部分。

有一些不那么复杂的正则表达式模式可以完成这项工作并捕获更多种类(例如,匹配不同命名的日期参数)。但是,这可能会导致模式在您不希望的情况下匹配。因此...

要将其转换为生产代码,请确保您对要删除的模式有详尽的说明,并调整正则表达式以精确匹配这些案例而不是其他任何内容!

或者,考虑采用多层次方法或以不同方式处理作业(例如,将路径拆分为组件,单独检查它们,重新组合它们;可能您的后续代码甚至可以用于拆分表示。)