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

Raz*_*192 3 java

我需要删除Twitter消息中找到的所有URL.我有一个包含大约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;
}
Run Code Online (Sandbox Code Playgroud)

这适用于以下情况:

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()"
Run Code Online (Sandbox Code Playgroud)

但是,当我得到一个案例如下:

http://t.co/nhWp9hldEH)aaa"
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 21
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

fge*_*fge 5

问题是您可能在URL中有正则表达式特殊字符,如您所见.

简短解决方案:使用Pattern.quote().您的代码将是:

tweet = tweet.replaceAll(Pattern.quote(m.group(i)),"").trim();
Run Code Online (Sandbox Code Playgroud)

注意:仅在JDK 1.5之后可用,但您确实使用此更好或更好,对吧?

另一种解决方案是简单地使用.replace():

tweet = tweet.replace(m.group(i), "").trim();
Run Code Online (Sandbox Code Playgroud)

与其名称所暗示的不同.replaceAll(),.replace() 确实取代了所有事件; 它只是将正则表达式作为替换字符串.另见.replaceFirst().

最后但同样重要的是,你似乎在滥用.group()!你的循环应该是:

while (m.find())
    tweet = tweet.replace(m.group(), "").trim();
Run Code Online (Sandbox Code Playgroud)

i这里不需要变量; m.group(i)将在一场比赛中返回i正则表达式中捕获组所匹配的内容.