使用Java中的正则表达式复制数组

时间:2014-10-06 22:04:38

标签: java arrays regex algorithm

我试图将String数组复制到另一个String数组中。但是,副本必须只包含原始Array的每个字符串的一部分。

例如,如果我们有

 String[] originalArray = {"/data/test2/", "/data/test4/", "/data/dropbox/test5/"}

我希望复制数组是

 String[] copyArray = {"test2", "test4", "test5"}

我的解决方案是简单地遍历原始数组并使用正则表达式来获取originalArray中字符串的最后一部分,并创建一个由这些值组成的copyArray。

上述方法是否有效,或者是否有更有效的解决方案?我也会在这种情况下使用正则表达式?我这样做的方式似乎有点过于粗暴。

理想情况下,我只是手动创建copyArray,但在这种情况下,originalArray的大小和精确内容是未知的。

修改

这似乎微不足道,但由于某种原因,它无法正常工作。

我添加了正则表达式。它似乎在测试人员中工作,但它不能像我希望的那样在程序中工作。我首先将originalArray转换为带有|的字符串为正则表达式附加。

String pattern = "/\\w+(?=\\||$)/g";
String testArray = originalArray.replaceAll(pattern," ");

然而,测试数组只是在没有应用正则表达式的情况下给我原始的连接字符串。

5 个答案:

答案 0 :(得分:2)

在java 7之前,你需要编写一个循环代码,但java 8引入了一个流程,允许一个流畅的单行解决方案:

String[] names = Arrays.stream(originalArray)
    .map(s -> s.replaceAll(".*/", ""))
    .toArray();

重要的一点是lambda expression将路径转换为名称,方法是使用正则表达式替换所有内容,包括最后一个带有空格的斜杠(有效地删除它)。

答案 1 :(得分:1)

你的方法很好。请注意,数组的长度始终通过其length字段获知。您应该使用new String[originalArray.length]创建副本。

答案 2 :(得分:1)

如果是一个字符串数组,你可以使用|之类的东西加入它,然后将一个RexEx应用于整个字符串,如:

/\w+(?=\||$)/g

Online Demo

答案 3 :(得分:1)

没有必要使用正则表达式来满足这个简单的要求。只需使用String#lastIndexOf()获取上一个/的索引,然后使用String#substring()方法获取所需的子字符串。

示例代码:

String[] originalArray = {"/data/test2", "/data/test4", "/data/dropbox/test5"};
String[] copyArray=new String[originalArray.length];

for(int i=0;i<originalArray.length;i++){
    copyArray[i]=originalArray[i].substring(originalArray[i].lastIndexOf("/")+1);
}

答案 4 :(得分:1)

String[] files(String[] originalArray) {
  List<String> copy = new ArrayList<>(originalArray.length);
  for (String s : originalArray) 
    copy.add(originalArray[idx].replaceFirst(".*([^/]*)$", "$1"));
  return copy.toArray(new String[copy.size()]);
}