2013-12-07 2 views
1

Я пытаюсь получить адрес с html-страницы. У меня есть регулярное выражение, из которого я узнаю состояние, город и номер телефона.Endless Loop matcher.find()

String linearray[] = newdoc.split("\n"); 
int count = 0; 
System.out.println(linearray.length); 
while(count<linearray.length) 
{ 
    System.out.println(count); 
    Pattern pattern = Pattern.compile("(.*?)(\\d{1,4}(\\s*\\w*)*)(\\s*)(CA|AZ|NY)(\\s*)(\\(?[1-9]\\d{2}\\)?\\s*\\d{3}\\d{4})?(.*?)"); 
    Matcher matcher = pattern.matcher(linearray[count].trim()); 
    while (matcher.find()) { 
     String state = matcher.group(5); 
     String city = matcher.group(2); 
     String phone = matcher.group(7); 
     System.out.println("state "+state+" city "+city+" phone "+phone+" "); 
    } 
    count++; 
} 

Когда я пытаюсь запустить этот код, он переходит в бесконечный цикл. Может ли кто-нибудь помочь мне в решении этого вопроса?

EDIT:

Когда linearray[count]=="Bombay Garden Newark SanMateo SantaClara &copy; 2011 Bombay Garden All Rights Reserved", мой код застревает на линии while(matcher.find()). Любая идея, почему он застрял там? когда я пропускаю эту строку (используя continue), код заканчивается просто отлично!

+1

Вы уверены, что бесконечный цикл не находится в другой части вашего кода? Я скопировал ваш код, и он отлично работает (и заканчивается) для меня. –

+0

Да, это в этой части кода, потому что я попытался напечатать что-то сразу после окончания второго цикла while, и он застревает до этого и ничего не печатает. – Nemin

+0

Вы пробовали отлаживать его? – Adarsh

ответ

3

Ваше регулярное выражение приводит к «catastrophic backtracking», что делает его слишком сложным для запуска до завершения.

Рассмотрите возможность перезаписи вашего регулярного выражения, чтобы быть более possessive.