Использование Regex для получения повторяющегося значения в строке

Заранее извиняюсь, если я неправильно понимаю использование Regex в этом контексте.

Я хотел бы получить повторяющееся поле из строки. Рассматриваемая строка выглядит примерно так:

TrendsJSONImpl{asOf=Fri Mar 08 00:04:26 GMT 2013, trendAt=Fri Mar 08 00:04:26 GMT 2013, >trends=[TrendJSONImpl{name='#TheBiggestLies', url='URL', query=' %23TheBiggestLies'}, TrendJSONImpl{name='#ICanHonestlySay', >url='URL', query='%23ICanHonestlySay'}, >TrendJSONImpl{name='#EuTenhoUmaQuedaPor', url='URL', query='%23EuTenhoUmaQuedaPor '}, >TrendJSONImpl{name='#CitePessoasExclusivamenteSuas', url='URL', query='%23CitePessoasExclusivamenteSuas'},

Из этой строки я хотел бы получить поле «имя» и добавить его в список. Эта строка представляет самые популярные темы в Твиттере и может изменяться каждый раз, когда вызывается метод, создавший ее.

Идеальным выводом было бы что-то вроде -

#Самая большая ложь

#ЯМожноГоворитьЧестно

#CitePessoasExclusivamenteSuas

Следуя предыдущим статьям здесь, я попытался извлечь поле имени с помощью следующего кода:

UI.model = new DefaultListModel();
            String trendsInfo = //FUNCTIONWHICHRETRIEVESSTRING
                    Matcher m = Pattern.compile("{name=").matcher(trendsInfo);
            Pattern p = Pattern.compile(
                    "{name='(.*),",
                    Pattern.DOTALL);
            Matcher matcher = p.matcher(trendsInfo);


            while (matcher.find()) {
                for (int i = 0; i < 20; i++) {
                    String output = m.group(i);
                    UI.model.addElement(output);
                    System.out.println(m.group(i));
                }
            }

К сожалению, это возвращает исключение Illegal Repetition, и я не уверен, как обрабатывать несколько запросов одного и того же поля. Любая помощь в этом вопросе будет оценена по достоинству.

Спасибо за ваше время!


person iainmac    schedule 08.03.2013    source источник
comment
Дополнительный совет: вместо "{name='(.*)," используйте "{name='(.*?)'", чтобы совпадение заканчивалось на первом апострофе после имени.   -  person Philippe A    schedule 08.03.2013


Ответы (2)


Причина, по которой вы получаете исключение, заключается в том, что у вас есть символ { в вашем регулярном выражении. Это зарезервированный символ, поэтому его нужно экранировать (\\{).

Кроме этого, вам, кажется, не хватает второго ' (перед запятой). Использование ленивого регулярного выражения также может быть хорошей идеей, поэтому окончательная версия будет выглядеть примерно так: \\{name='(.*?)',. Может быть, вы даже захотите добавить символ решетки, чтобы сделать его более точным: \\{name='(#.*?)',...

person mkataja    schedule 08.03.2013
comment
Всем привет! Большое спасибо за быстрый ответ. Я принял ваше предложение к сведению и изменил код, но, к сожалению, я все еще получаю исключение, в частности -Exception в потоке AWT-EventQueue-0 java.util.regex.PatternSyntaxException: Недопустимое повторение {name= Любые мысли? Спасибо! - person iainmac; 08.03.2013
comment
Вы также избежали другого регулярного выражения в третьей строке кода вашего примера? Всегда, когда у вас есть литерал {, вам нужно писать \\{, так как { зарезервировано для повторений. - person mkataja; 08.03.2013
comment
Привет mkataja, Большое спасибо за вашу помощь еще раз! Я решил проблему с исключением, но по какой-то причине он не возвращает всю информацию из строки, а только 5 результатов. Вот мой последний код: String trendInfo = WorldWideTrendsList.toString(); System.out.println(trendsInfo); Pattern p = Pattern.compile((#.*?)\\', Pattern.DOTALL); Matcher matcher = p.matcher(trendsInfo); while (matcher.find()) { String output = matcher.group(1); Система.out.println(выход); UI.model.addElement(выход); - person iainmac; 08.03.2013
comment
Привет, глядя на код в вашем комментарии, я не могу понять, в чем может быть проблема. Поскольку это, кажется, немного другая проблема, чем раньше, может быть, вам следует опубликовать ее как новый вопрос? - person mkataja; 08.03.2013
comment
Привет, мкатая! Спасибо за помощь буду делать! - person iainmac; 08.03.2013

{ — это оператор повторения для регулярного выражения, поэтому вам нужно экранировать его следующим образом: \\{.

person Philippe A    schedule 08.03.2013