摆脱模式规则中的空白

时间:2016-12-12 15:37:56

标签: java pattern-matching

我有以下模式规则:

static List<String> fetchUrls( String tweet ) {
     List<String> url = new ArrayList<String>();
     Pattern p = Pattern.compile( "(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)" + "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*" + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)");
     Matcher matcher = p.matcher( tweet );

     while ( matcher.find() ) {
         url.add( matcher.group() ); // When an URL is detected, we add it to the Array List
     }

     return url;
}

但是,当我打印ArrayList的字符串表示时,我在第一个url之前有一个空格。我怎样才能摆脱这个空白?

1 个答案:

答案 0 :(得分:0)

您可以将(?:^|[\W])替换为\b,因为您将字符串的开头或非字母字符与该交替组匹配。

由于下一个子模式是h,因此前面的\b与字符串开头的位置或非单词字符匹配。

如果您想继续使用您的模式,它将显示为

Pattern p = Pattern.compile( "\\b((ht|f)tp(s?):\\/\\/|www\\.)" + "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*" + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)");
                              ^^^

现在,matcher.group()应该收集网址而不会引导非字符字符。

您可以摆脱不必要的转义反斜杠和

等组
"\\b(?:(?:ht|f)tps?://|www\\.)" + 
"(?:(?:[\\w-]+\\.)+?(?:[\\w.~-]+/?)*" + 
"[\\p{Alnum}.,%_=?&#+()\\[\\]*$~@!:/{};'-]*)"