1

我正在编写一个函数来删除转义字符,它把我扔了PatternSyntaxException。我在这里想念什么?我将该函数编写为单个应用程序,尽管如此,我还是收到了这个错误。

public class test {
public static void main(String a[])
{

    String keyword = "otterbox 3500 series { { waterproof case \\(clear\\) phones";

    if(keyword.contains("\\")){
        int l=0;
        int l2=0;
        for (int i = 0; i < keyword.length(); i++){         
            char c = keyword.charAt(i);
            if(c=='\\')l++;
            if (c == '!' || c == '(' || c == ')' || c == '&' ||
                    c == ':'  || c == '^' || c == '[' || c == ']' || c=='-'||
                    c == '{'  || c == '}' || c == '~'){
                keyword =keyword.replaceAll("\\\\"+c, ""+c); 
                l2++;               
            }
        }       

        if(l==1) keyword= keyword.replaceAll("\\\\", "");
        if(l>1 && l2==1) keyword = keyword.replaceFirst("\\\\", "");
    }

    System.out.println("Final    "+keyword);


}}

它向我抛出了以下异常:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 1
 {

at java.util.regex.Pattern.error(Unknown Source)
at java.util.regex.Pattern.closure(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.<init>(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.lang.String.replaceAll(Unknown Source)
at test.main(test.java:21)
}
4

2 回答 2

2

{}字符是正则表达式中的特殊字符——它们表示重复范围(例如匹配ab{3,5}ana后跟三到五个bs)。

您需要在正则表达式中相应地转义此字符,如\{.


在您的特定情况下,我认为您通过在序列的某些部分上始终使用正则表达式替换,同时对其进行迭代,从而使事情变得非常困难(并且效率低下)。

如果您要使用正则表达式,只需在整个字符串上使用单个正则表达式替换即可删除所有您不想要的字符。例如

String keyword = "otterbox 3500 series { { waterproof case \\(clear\\) phones";
String result = keyword.replaceAll("[!()&:^\\[\\]\\-\\\\{}~]", "");

如果您要遍历字符串并一次检测一个不需要的字符,那么只需执行此迭代并构建您的输出,跳过您想要遗漏的字符。例如:

StringBuilder result = new StringBuilder();
for (int i = 0; i < keyword.length(); i++){         
   char c = keyword.charAt(i);
   if (c == '!' || c == '(' || c == ')' || c == '&' || c == '\\'
                c == ':'  || c == '^' || c == '[' || c == ']' || c=='-'||
                c == '{'  || c == '}' || c == '~') {
      // skip it, don't add to result
   }
   else {
      result.add(c);
   }
}
于 2012-10-25T10:31:20.987 回答
0

代替:

keyword = keyword.replaceAll("\\\\"+c, ""+c);

用这个:

keyword = keyword.replaceAll("\\"+c, ""+c);

原因是这\\\\意味着文字退格字符本身,但是您打算仅使用这些正则表达式特殊字符来转义\\

于 2012-10-25T10:34:59.440 回答