2013-09-20 2 views
2

У меня есть вопрос относительно indexOf(). Я пытаюсь запрограммировать EmailExtractor (Да, это домашнее задание, но я не ищу код), который извлекает весь адрес электронной почты из предложения, которое вводится пользователем.Поиск n-го вхождения символа в строке с использованием IndexOf()

Например: Пользовательский ввод: напишите нам по адресу [email protected] с вашими запросами. Затем программа отобразит [email protected] из вышеперечисленного String. Я понимаю, indexOf() и substring() не требуется.

Идея, которую я имею сейчас, - использовать indexOf(), чтобы найти «@», а затем искать пустое пространство непосредственно перед адресом электронной почты, введенным пользователем (nth).

Мой код выглядит следующим образом:

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 [email protected] with your queries".indexOf(" ") is 4, я пытаюсь получить 10. Однако условие IF, которое у меня есть, заставит его перейти к следующему экземпляру indexOf(), который равен 25. (Потому что 10 < 14).

Как я могу избежать этого?

Еще раз, я не ищу чисто ответ, скорее, я пытаюсь решить проблему. Заранее спасибо!

+1

Нужно ли использовать метод indexOf? –

+0

Почему бы вам не разбить String, а затем найти, в каком из них есть '@'? –

+0

Простым решением является использование некоторой другой переменной вместо 'spaceAt' для хранения результата' mailInput.indexOf ("", ...) 'и убедитесь, что результат меньше индекса' @ '. Затем присвойте 'spaceAt' этому результату * только *, если он меньше. В противном случае вы можете использовать 'break', чтобы выйти из цикла' for', так как вы закончили поиск. Это пример «lookahead», т. Е. Вам нужно посмотреть на следующий результат, чтобы увидеть, приемлемо ли это, прежде чем вы его используете. Также подумайте о том, что произойдет, если больше нет пробелов, когда вы делаете свой 'indexOf'. – ajb

ответ

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); 
0

вы можете использовать регулярные выражения вместо использования indexOf() и substring()

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

использовать шаблон и Искатель, чтобы подтвердить электронный идентификатор в ваша строка. This может дать вам четкое представление о нем

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

(Там должны были бы быть маленький кусочек краеугольный случае тестирования, но только если нет пробелов ни перед знаком @ или после знака @)

+0

также, если после знака @ нет пробелов. – ajb

+0

@ajb Ах, правда, я обновлю свой ответ. –

Смежные вопросы