使用IndexOf()查找字符串中第n个字符的出现次数

时间:2013-09-20 16:01:11

标签: java string substring indexof lastindexof

我对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)。

如何避免这种情况发生?

再次,我不是纯粹寻找答案,而是试图找到解决方案。提前谢谢!

3 个答案:

答案 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;
}

(需要进行一些角落测试,但仅限于@符号之前或@符号之后没有空格的情况)