我有一个字符串
"H:\\DVR mo\\Whats app video\\Sent\\VID-20170430-WA0006.mp4"
我想知道字符串中有多少斜杠,我在String#charAt
函数的帮助下找到了它。
现在,我知道上面的字符串中有4
斜杠。我想从索引零到第二次出现斜杠选择字符串。所以期望的结果是:
"H:\\DVR mo"
但我不知道如何找到第二次出现的索引。
答案 0 :(得分:1)
模块化,独立于平台的解决方案:
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
如果您的字符串始终代表有效的文件系统路径,则应将解析输入视为Path
(documentation)。因此,请使用Paths#get
方法(documentation)。
Path
类提供了在给定路径上导航的各种方法,例如getRoot
或getParent
。由于我们要从第一个文件元素到第二个文件元素创建Path
,我们将使用Path#iterator
(documentation):
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);
更紧凑的Stream
(documentation)方法:
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#indexOf
(documentation)方法代替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#split
(documentation)方法,该方法基本上也是如此:
// 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];