我需要删除Twitter消息中找到的所有网址。我有一个包含大约200,000条此类消息的文件,因此速度至关重要!为此,我使用Java作为编程语言,这是我的代码示例:
public String performStrip(){
String tweet = this.getRawTweet();
String urlPattern = "((https?|http)://(bit\\.ly|t\\.co|lnkd\\.in|tcrn\\.ch)\\S*)\\b";
Pattern p = Pattern.compile(urlPattern,Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(tweet);
int i = 0;
while (m.find()) {
tweet = tweet.replaceAll(m.group(i),"").trim();
i++;
}
return tweet;
}
以下情况适用:
http://t.co/nhWp9hldEH -> (empty string)
http://t.co/nhWp9hldEH" -> "
http://t.co/nhWp9hldEH)aaa" -> aaa"
aaa(http://t.co/nhWp9hldEH" -> aaa("
aaa(http://t.co/nhWp9hldEH)" -> aaa()"
然而,当我得到如下案件时:
http://t.co/nhWp9hldEH)aaa"
我收到错误
java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 21
at java.util.regex.Pattern.error(Pattern.java:1924)
at java.util.regex.Pattern.compile(Pattern.java:1669)
at java.util.regex.Pattern.<init>(Pattern.java:1337)
at java.util.regex.Pattern.compile(Pattern.java:1022)
at java.lang.String.replaceAll(String.java:2210)
at com.anturo.preprocess.url.UrlStripper.performStrip(UrlStripper.java:47)
at com.anturo.preprocess.testing.ReadIn.<init>(ReadIn.java:35)
at com.anturo.preprocess.testing.Main.main(Main.java:6)
我已经查看过有关此错误的多个类似问题,但到目前为止还没有任何工作...希望有人可以帮助我。
答案 0 :(得分:5)
问题在于,您可能会在URL中使用正则表达式特殊字符。
简短解决方案:使用Pattern.quote()
。那么你的代码就是:
tweet = tweet.replaceAll(Pattern.quote(m.group(i)),"").trim();
注意:仅在JDK 1.5之后可用,但你确实使用了这个或更好,对吧?
另一种解决方案是简单地使用.replace()
:
tweet = tweet.replace(m.group(i), "").trim();
与其名称与.replaceAll()
的建议不同,.replace()
替换所有出现次数;它只是将正则表达式作为替换字符串。另请参阅.replaceFirst()
。
最后但并非最不重要的是,您似乎在滥用.group()
!你的循环应该是:
while (m.find())
tweet = tweet.replace(m.group(), "").trim();
此处不需要i
变量; m.group(i)
将进行一次匹配,返回正则表达式中捕获组i
所匹配的内容。