java regex / arraylist问题,无法获得匹配/ arraylist存储新值

时间:2012-02-13 02:36:11

标签: java android regex arraylist

刚进入java数组和正则表达式并尝试构建我之前在php中构建的程序,我需要发生的是我有一个来自twitter的arraylist我想使用正则表达式查找包含链接的文本,如果一个文本包含我想要将这些新值添加到我想要显示的新数组的链接,但是最后一个数组返回空,这意味着在某些时候我的代码中的正则表达式没有正确匹配或者值没有转移对于新阵列,因为我是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 个答案:

答案 0 :(得分:2)

你的正则表达式中有许多未转义的特殊字符(例如+,以及.:以及|之类的字符这意味着正则表达式解析器,并且不匹配文字文本,除非你逃避它们)。

我个人总是逃避正则表达式中的所有特殊字符,即使对于正则表达式解析器没有特殊含义的字符也是如此。在我看来,忘记逃避问题所导致的问题可能会让人感到困惑而无法调试,因为它不值得冒险逃避。

所以我会像patternStr那样:

String patternStr = "(https?|ftp|file)\\://[\\-a-zA-Z0-9\\+\\&\\@\\#/\\%\\?\\=\\~\\_\\|\\!\\:\\,\\.\\;]*[\\-a-zA-Z0-9\\+\\&\\@\\#/\\%\\=\\~\\_\\|]";

不是很漂亮,但它完成了工作。

以下是一个示例:http://ideone.com/W8s3p

答案 1 :(得分:0)

首先,我会仔细检查你的正则表达式。逐步调试调试器中的代码。其次,我会使用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);
}