子串的路径,找不到第二次出现的\\

时间:2018-03-25 13:28:07

标签: java

我有一个字符串

"H:\\DVR mo\\Whats app video\\Sent\\VID-20170430-WA0006.mp4"

我想知道字符串中有多少斜杠,我在String#charAt函数的帮助下找到了它。

现在,我知道上面的字符串中有4斜杠。我想从索引零到第二次出现斜杠选择字符串。所以期望的结果是:

"H:\\DVR mo"

但我不知道如何找到第二次出现的索引。

2 个答案:

答案 0 :(得分:1)

TL;博士

模块化,独立于平台的解决方案:

String result = StreamSupport.stream(Paths.get(input).spliterator(), false)
    .skip(numberOfSubPath - 1)
    .findFirst()
    .map(Path::toString)
    .orElseThrow(IllegalArgumentException::new);

紧凑但非灵活的解决方案:

String result = Pattern.compile("\\").splitAsStream(input)
    .limit(numberOfSubPath)
    .collect(Collectors.joining("\\"));

对于您的示例,请将变量设置为:

String input = "H:\\DVR mo\\Whats app video\\Sent\\VID-20170430-WA0006.mp4";
int numberOfSubPath = 2;

使用Path

如果您的字符串始终代表有效的文件系统路径,则应将解析输入视为Pathdocumentation)。因此,请使用Paths#get方法(documentation)。

Path类提供了在给定路径上导航的各种方法,例如getRootgetParent。由于我们要从第一个文件元素到第二个文件元素创建Path,我们将使用Path#iteratordocumentation):

String input = "H:\\DVR mo\\Whats app video\\Sent\\VID-20170430-WA0006.mp4";
int numberOfSubPath = 2;

Path path = Paths.get(input);
Iterator<Path> subPaths = path.iterator();
Path result = null;

// Iterate to the desired subpath
for (int i = 0; i < numberOfSubPath; i++) {
    // If there is no such subpath
    if (!subPaths.hasNext()) {
        throw new IllegalArgumentException("The input does not have a subpath of number"
            + numberOfSubPath);
    }

    // Assign the current subpath as possible result
    result = subPaths.next();
}
// The variable 'result' now holds the desired subpath

System.out.println(result);

更紧凑的Streamdocumentation)方法:

Path path = Paths.get(input);
String result = StreamSupport.stream(path.spliterator(), false)  // Stream<Path>
    .skip(numberOfSubPath - 1)  // Skip all elements before desired path
    .findFirst()                // Optional<Path>
    .map(Path::toString)        // Optional<String>
    .orElseThrow(IllegalArgumentException::new);  // The subpath as String or exception

使用String

如果您出于某种原因希望使用String来执行此任务,我建议您使用String#indexOfdocumentation)方法代替String#charAt查找第二个\\出现的索引。之后,使用String#substring来提取该部分(documentation)。

int lastIndex = -1;
for (int i = 0; i < numberOfSubPath; i++) {
    // Find the next occurrence starting from 'lastIndex'
    lastIndex = input.indexOf("\\", lastIndex);

    // There is no next occurrence
    if (lastIndex == -1) {
        throw new IllegalArgumentException("The input does not have a subpath of number"
            + numberOfSubPath);
    }
}

// Extract the text from the beginning to 'lastIndex'
String result = input.substring(0, lastIndex);

或者您可以使用String#splitdocumentation)方法,该方法基本上也是如此:

// Split the input on each '\\', limit the results
String[] parts = input.split("\\", numberOfSubPath + 1);

// Build the result by concatenating the parts (and adding '\\' again)
StringJoiner result = new StringJoiner("\\");
for (int i = 0; i < numberOfSubPath; i++) {
    result.add(parts[i]);
}

System.out.println(result.toString());

使用Stream s:

String result = Pattern.compile("\\").splitAsStream(input)
    .limit(numberOfSubPath)
    .collect(Collectors.joining("\\"));

答案 1 :(得分:0)

如果你希望它能够处理你明确知道字符串的字符串,那么最好的办法就是像其他人建议的那样使用Path类。

否则,您始终使用String.split方式。当然,我写的代码缺少所有的检查部分。

String s = "H:\\DVR mo\\Whats app video\\Sent\\VID-20170430-WA0006.mp4";
String[] array = s.split("\\");
String result = array[0]+"\\"+array[1];