Java PatternSyntaxException:无与伦比的结束'('

时间:2014-02-17 09:01:47

标签: java

我需要删除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

http://t.co/nhWp9hldEH)aa

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)

我已经查看过有关此错误的多个类似问题,但到目前为止还没有任何工作...希望有人可以帮助我。

1 个答案:

答案 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所匹配的内容。