2

我有一个关于indexOf(). 我正在尝试编写一个EmailExtractor(是的,这是一个家庭作业,但我不是在寻找代码),它从用户输入的句子中提取整个电子邮件地址。

例如 - 用户输入:将您的查询发送至 abc@def.ghi.jk 给我们。 然后程序将显示上面的abc@def.ghi.jkString。我理解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。(因为 10 < 14)。

我该如何避免这种情况发生?

再一次,我不是在寻找纯粹的答案,而是在尝试解决解决方案。提前致谢!

4

3 回答 3

3

How about finding the space before and after the @

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);
于 2013-09-20T16:13:01.363 回答
0

您可以使用正则表达式而不是使用indexOf()andsubstring()

^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"+"[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"

使用 Pattern 和 Matcher 来验证字符串中的电子邮件 ID。 可能会让你对它有一个清晰的认识

于 2013-09-20T16:15:39.790 回答
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;
}

(需要进行一些极端情况测试,但前提是 @ 符号之前或 @ 符号之后没有空格)

于 2013-09-20T16:24:33.397 回答