2016-12-12 2 views
1

У меня есть следующее правило шаблона:Избавиться от пробелов в шаблонном правиле

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}.,%_=?&#\\-+()\\[\\]\\*[email protected]!:/{};']*)"); 
    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, у меня есть пробел перед первой ссылкой. Как я могу избавиться от этого пробела?

+2

подрезки значения, если вы не хотите, чтобы изменить регулярное выражение: url.add (. Matcher.group() отделка()) – Nagaraddi

ответ

0

Вы можете заменить (?:^|[\W]) на \b, так как вы соответствуете началу строки или не-словному символу с этой группой чередования.

Поскольку следующий подшаблон: h, \b, прежде чем он точно совпадает с местоположением в начале строки или символом, отличным от слова.

Если вы хотите продолжать использовать свой шаблон, он будет выглядеть, как

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

Теперь matcher.group() должны собирать адреса без ведущих символов без слов.

Вы можете избавиться от ненужных уходящих групп и обратных косых черт, как

"\\b(?:(?:ht|f)tps?://|www\\.)" + 
"(?:(?:[\\w-]+\\.)+?(?:[\\w.~-]+/?)*" + 
"[\\p{Alnum}.,%_=?&#+()\\[\\]*[email protected]!:/{};'-]*)" 
Смежные вопросы