Java регулярное выражение / ошибка arraylist, не удается получить совпадения / Arraylist хранить новые значения - PullRequest
0 голосов
/ 13 февраля 2012

просто попадаю в java-массивы и регулярные выражения и пытаюсь создать программу, которую я когда-то ранее создавал в php, что мне нужно сделать, так это то, что у меня есть массив из твиттера, который я хотел бы использовать регулярными выражениями для поиска текста, содержащего ссылки, еслитекст содержит ссылки, которые я хочу добавить эти новые значения в новый массив, который я хотел бы отобразить, однако окончательный массив возвращает пустое значение, означающее, что в какой-то момент либо регулярное выражение в моем коде не соответствует должным образом, либо значения не передаются черезв новый массив, так как я новичок в Java, я не могу определить, где это происходит, любая помощь будет огромной, заранее спасибо.

protected void onPostExecute(ResponseList<twitter4j.Status> results) {
        // TODO Auto-generated method stub
        super.onPostExecute(results);
        ArrayList<twitter4j.Status> al = new ArrayList<twitter4j.Status>();

        for(twitter4j.Status statii: results){

            String patternStr = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
            Pattern pattern = Pattern.compile(patternStr);
            Matcher matcher = pattern.matcher(statii.getText());
            if(matcher.find() == true){
                al.add(statii); 
            }
        }

        StatusListAdapter adapter = new StatusListAdapter(
                TweepicsappActivity.this, al);
        setListAdapter(adapter);
    }

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

В вашем регулярном выражении есть куча неэкранированных специальных символов (например, такие как + и , и . и : и |, которые имеют значение для синтаксического анализатора регулярного выражения и не соответствуют литералутекст, если вы не избежите их).

Лично я всегда экранирую все специальные символы в регулярном выражении, даже если они не имеют особого значения для синтаксического анализатора регулярного выражения.Проблемы, вызванные забыванием о побеге, могут быть слишком запутанными для отладки, чтобы, по моему мнению, стоило рисковать, не убегая от чего-то.1013 * Не очень красиво, но оно выполняет свою работу.

Вот пример: http://ideone.com/W8s3p

0 голосов
/ 13 февраля 2012

Во-первых, я бы дважды проверил ваше регулярное выражение. Шаг через код в отладчике. Во-вторых, я бы использовал matcher.matches (), а не find (). Наконец, если важна производительность, я бы использовал оба Matcher - инициализируя его как статический член в инициализаторе статического класса.

private static final Matcher matcher;

static {
   String patternStr = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
   Pattern pattern = Pattern.compile(patternStr);
   matcher = pattern.matcher("");
}

protected void onPostExecute(ResponseList results) {
    // TODO Auto-generated method stub
    super.onPostExecute(results);
    ArrayList al = new ArrayList();

    for(twitter4j.Status statii: results) {
        matcher.reset(statii.getText());
        if(matcher.matches()) {
            al.add(statii); 
        }
    }

    StatusListAdapter adapter = new StatusListAdapter(TweepicsappActivity.this, al);
    setListAdapter(adapter);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...