【问题标题】:Copy array using Regular Expression in Java在 Java 中使用正则表达式复制数组
【发布时间】:2014-10-06 22:04:38
【问题描述】:

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

例如,如果我们有

 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," ");

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

【问题讨论】:

  • Java 8 在这个问题的范围内吗?
  • 不幸的是它不是。 8 中有什么东西对此有用吗?
  • 如果这些是文件路径,您也许可以使用new File(pathname).getName() 来提取路径的最后一部分,而不是使用正则表达式。虽然它的效率可能有点低。

标签: java arrays regex algorithm


【解决方案1】:

到 java 7,您需要编写一个循环,但 java 8 引入了流,允许流畅的单行解决方案:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      Online Demo

      【讨论】:

      • 如果你看到我编辑的帖子,我在我的字符串上试过这个,它不能作为演示工作。知道为什么吗?
      【解决方案4】:

      对于这个简单的要求,不需要使用正则表达式。只需使用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);
      }
      

      【讨论】:

        【解决方案5】:
        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()]);
        }
        

        【讨论】:

          猜你喜欢
          • 2017-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2012-01-23
          • 1970-01-01
          相关资源
          最近更新 更多