我尝试从长字符串获取字符串,即Firebase网址
"https://firebasestorage.googleapis.com/v0/b/No-manworld-3577.appspot.com/o/Contacts%2F1510361061636_Julien_Vcf?alt=media&token=c0bff20d-d115-4fef-b58c-4c7ffaef4296"
现在,如果您注意到上面字符串中名称 Julien 之前和之后得分不足。我想知道这个名字,但我得到了
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
这是我的一段代码
String s="https://firebasestorage.googleapis.com/v0/b/No-manworld-3577.appspot.com/o/Contacts%2F1510361061636_Julien_Vcf?alt=media&token=c0bff20d-d115-4fef-b58c-4c7ffaef4296";
String newName=s.substring(s.indexOf("_")+1, s.indexOf("_"));
System.out.println(newName);
答案 0 :(得分:2)
正如我在评论中所说,当使用子字符串时,第一个数字必须小于第二个数字。
在您的情况下,您使用x + 1
和x
调用子字符串。 x + 1
> x
因此子字符串失败,x
为s.indexOf("_")
。
我们了解到您正试图获取_
的{{3}}。
以下代码会产生Julien
:
String s = "...";
int start = s.indexOf("_") + 1;
int end = s.indexOf("_", start);
// name will hold the content of s between the first two `_`s, assuming they exist.
String name = s.substring(start, end);
答案 1 :(得分:0)
如果要求不明确哪个2 _
选择,那么这里是Java 8 Stream的做法..
public class Check {
public static void main(String[] args) {
String s = "https://firebasestorage.googleapis.com/v0/b/No-manworld-3577.appspot.com/o/Contacts%2F1510361061636_Julien_Vcf?alt=media&token=c0bff20d-d115-4fef-b58c-4c7ffaef4296";
long count = s.chars().filter(ch -> ch == '_').count();
if (count == 2) {
System.out.println(s.substring(s.indexOf('_') + 1, s.lastIndexOf('_')));
} else {
System.out.println("More than 2 underscores");
}
}
}
为什么您的代码无效?
假设s.indexOf("_")
得到一些正数,说10
,然后转换为... {/ p>
String newName=s.substring(s.indexOf("_")+1, s.indexOf("_"));
String newName=s.substring(11, 10);
这会为StringIndexOutOfBoundsException
方法提供endIndex < beginIndex
subString
。