2012-02-13 55 views
0

刚刚进入java数组和正则表达式,并试图建立一个程序我曾经建立在php中,我需要发生的是我有一个从twitter的arraylist我想使用正则表达式来查找包含链接的文本,如果文本包含链接,我想将这些新值添加到我想要显示的新数组中,但最终数组返回为空,这意味着在某个时间点我的代码中的正则表达式没有正确匹配或值不转移到新的数组,因为我是新来的这在Java我不能发现哪里出错了,任何帮助将是巨大的,在此先感谢。java正则表达式/ arraylist问题,无法获得匹配/ arraylist商店新值

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

不需要'matcher.find()== true'简单'matcher.find()'会工作。 – RanRag 2012-02-13 02:39:28

+0

有趣的是,但我仍然无法捕捉到新数组中的任何东西,我故意设置结果以包含文本中的所有链接,但我在这里完成的工作似乎仍然存在缺陷,我的正则表达式可能会关闭吗? – 2012-02-13 02:52:41

+0

我无法为你解决这个问题 - 但我建议将正则表达式逻辑移动到'doInBackground(...)'线程,并将'ArrayList '返回给'onPostExecute(... )'因为,正如javadoc所示(http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)),'onPostExecute(...)'在UIThread上运行.. – 2012-02-13 02:55:28

回答

2

你的正则表达式有一堆在它转义特殊字符(即东西像+,.:|认为更有意义的正则表达式解析器,除非你逃脱他们不匹配的文字文本) 。

就个人而言,我总是在正则表达式中转义所有特殊字符,即使对于正则表达式解析器没有特殊含义的人也是如此。在我看来,由于忘记逃离而造成的问题可能太过扑朔迷离,无法调试,因为它值得冒着失败的危险。

所以我会做patternStr,如:

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

不是很漂亮,但它能够完成任务。

下面是一个例子:http://ideone.com/W8s3p

+0

这是不正确的。如果他试图匹配。 (点),例如,他需要逃避它\。但是我没有看到他的正则表达式中的任何东西都不是实际模式的一部分。 – brettw 2012-02-13 02:58:11

+0

这个新的正则表达效果很好!但我想也做更多的特定匹配在PHP我能够简单地做一个像这样的字符串模式,以找到更具体的正则表达式,但是这不工作在Java中是否有一个Java相当于这个? $ hosts2 =“bit.ly | t.co”; $ regex =“〜http://($ hosts)〜” – 2012-02-13 03:00:57

0

首先,我会仔细检查你的正则表达式。逐句通过调试器中的代码。其次,我会使用matcher.matches()而不是find()。最后,如果性能很重要,我会重用Matcher - 将其初始化为静态类初始化程序中的静态成员。

 
private static final Matcher matcher; 

static { 
    String patternStr = "^(https?|ftp|file)://[[email protected]#/%?=~_|!:,.;]*[[email protected]#/%=~_|]"; 
    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); 
}