我有以下模式规则:

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之前有一个空格。我如何摆脱这个空白?

最佳答案

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

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

如果您想继续使用模式,它将看起来像

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


现在,matcher.group()应该收集没有前导非单词字符的URL。

您可能会摆脱不必要的转义反斜杠和类似的组

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

关于java - 消除模式规则中的空白,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41104336/

10-15 01:16
查看更多