让我们说url = "http://gmail.com"
我试着从中创建一个字符串dnsname = "Top-level com"
。
现在我们运行以下代码:
System.out.println(url);
String[] urlsplit = new String[3];
System.out.println(url.substring(10,11));
urlsplit = url.split(url.substring(10,11));
String dnsname = "Top-level " + urlsplit[urlsplit.length - 1];
System.out.println(dnsname);
作为输出,我们得到:
http://www.gmail.com
.
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
我没有看到我犯的错误,但必须有一个。
答案 0 :(得分:1)
我认为点被认为是regex模式意味着"任何字符"所以你的split方法返回一个空数组。只需执行以下操作:
String url = "http://gmail.com";
System.out.println(url);
//Escape the . to tell the parser it is the '.' char and not the regex symbol .
String[] urlsplit = url.split("\\.");
String dnsname = "Top-level " + urlsplit[urlsplit.length - 1];
System.out.println(dnsname);
如果使用"运行相同的代码。"而不是" \。"您将遇到与代码中相同的问题。因为s.split("。")实际上返回一个空数组,因此urlsplit.length - 1
为负数,而urlsplit[urlsplit.length - 1]
显然是超出界限。
答案 1 :(得分:0)
这是避免记住所有正则表达式元字符的最佳方法:
String url = "http://gmail.com";
System.out.println(url);
String[] urlsplit = new String[3];
System.out.println(url.substring(12, 13));
urlsplit = url.split(Pattern.quote(url.substring(12, 13)));
String dnsname = "Top-level " + urlsplit[urlsplit.length - 1];
System.out.println(dnsname);
注意:你可能会更好:
urlsplit = url.split(Pattern.quote("."));
如果您运行此代码,您将获得:
http://gmail.com
.
Top-level com
答案 2 :(得分:0)
问题是String#split接收正则表达式,点(。)符号是正则表达式中的特殊字符,因此您需要将其作为普通符号发送。
替换
urlsplit = url.split(url.substring(10,11));
与
urlsplit = url.split("\\"+url.substring(10,11));
或者干脆就这样做
urlsplit = url.split("\\.");
但问题是为什么ArrayOutOfBoundsException
?
由于split
函数中的错误模式,数组永远不会被填充。
并且您试图访问它的第二个索引的值,所以在这种情况下它给了你一个ArrayOutOfBoundsException
答案 3 :(得分:0)
如果我理解你的问题,你想要输出
Top-level com
如果这是您想要的URL,请考虑使用java.net.URL
类和split()
。
import java.net.MalformedURLException;
import java.net.URL;
public class Program {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://gmail.com/");
System.out.println(url);
String[] hostParts = url.getHost().split("\\.");
String dnsname = "Top-level " + hostParts[hostParts.length - 1];
System.out.println(dnsname);
}
}
输出:
http://gmail.com
Top-level gmail.com
这也有利于处理不仅是主机名的网址,例如,给定http://www.example.co.aq/query.exe?field=name&id=12#fragment
,这将输出Top-level aq
。