我对indexOf()
有疑问。我正在尝试编写一个EmailExtractor
(是的,这是一个家庭作业,但我不是在寻找代码),它从用户输入的句子中提取整个电子邮件地址。
例如 -
用户输入:请发送电子邮件至abc@def.ghi.jk与我们联系。
然后,该程序将显示上述String
中的 abc@def.ghi.jk 。我了解indexOf()
和substring()
是必需的。
我现在的想法是使用indexOf()
找到'@',然后在用户输入的电子邮件地址(第n)之前搜索空白区域。
我的代码如下:
System.out.println("This is an Email Address Extractor.\n");
System.out.print("Enter a line of text with email address: ");
String emailInput = scn.nextLine();
int spaceAt = emailInput.indexOf(" ");
for (int i = 1; i <= emailInput.indexOf("@"); i++){
if (spaceAt < emailInput.indexOf("@")) {
spaceAt = emailInput.indexOf(" ", spaceAt + 1);
}
}
我理解并且意识到我的代码中存在的问题。
1)"Mail us at abc@def.ghi.jk with your queries".indexOf(" ")
是4,我试图得到10.但是,我输入的IF条件将使它跳到下一个indexOf()的实例,即25。 14)。
如何避免这种情况发生?
再次,我不是纯粹寻找答案,而是试图找到解决方案。提前谢谢!
答案 0 :(得分:3)
如何在@
之前和之后找到空格int at = emailInput.indexOf('@');
int start = emailInput.lastIndexOf(' ', at) + 1;
int end = emailInput.indexOf(' ', at);
if (end == -1) end = emailInput.length();
String email = emailInput.substring(start, end);
答案 1 :(得分:0)
您可以使用正则表达式,而不是使用indexOf()
和substring()
^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"+"[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"
使用Pattern和Matcher验证字符串中的电子邮件ID。 This可能会给你一个明确的观点
答案 2 :(得分:0)
你可以做的一件事就是调用indexOf
并在循环的同一次迭代中测试结果,而不是保存下一次迭代的检查。像这样的东西大多是伪代码:
spaceAt := 0
indexOfAtSign := emailInput.indexOf('@');
while (spaceAt < indexOfAtSign) { // you never really used i anyway
temp := index of next space
if (temp > indexOfAtSign) break;
else spaceAt = temp;
}
(需要进行一些角落测试,但仅限于@符号之前或@符号之后没有空格的情况)