Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除转义时出现正则表达式异常_Java_Regex_Exception - Fatal编程技术网

Java 删除转义时出现正则表达式异常

Java 删除转义时出现正则表达式异常,java,regex,exception,Java,Regex,Exception,我正在编写一个函数来删除转义字符,它抛出了PatternSyntaxException。我错过了什么?我将该函数作为单个应用程序编写,尽管我遇到了这个错误 public class test { public static void main(String a[]) { String keyword = "otterbox 3500 series { { waterproof case \\(clear\\) phones"; if(keyword.contains("\\"

我正在编写一个函数来删除转义字符,它抛出了
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);


}}
公共类测试{
公共静态void main(字符串a[]
{
String关键字=“otterbox 3500系列{{防水外壳\\(透明\\)手机”;
if(关键字.contains(“\\”){
int l=0;
int l2=0;
对于(inti=0;i1&&l2==1)关键字=关键字.replaceFirst(“\\\\”,”);
}
System.out.println(“Final”+关键字);
}}
它向我抛出了以下异常:

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)
}
线程“main”java.util.regex.PatternSyntaxException中的异常:索引1附近的非法重复 { 位于java.util.regex.Pattern.error(未知源) 位于java.util.regex.Pattern.closure(未知源) 位于java.util.regex.Pattern.sequence(未知源) 位于java.util.regex.Pattern.expr(未知源) 位于java.util.regex.Pattern.compile(未知源代码) 位于java.util.regex.Pattern。(未知源) 位于java.util.regex.Pattern.compile(未知源代码) 位于java.lang.String.replaceAll(未知源) at test.main(test.java:21) }
在正则表达式中,
{
}
字符是特殊字符-它们表示重复边界(例如,
ab{3,5}
匹配
a
,后跟三到五个
b
s)

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


在您的特殊情况下,我认为您在对序列的某些部分进行迭代时,始终使用正则表达式替换,这让您的工作变得非常困难(而且效率低下)

如果要使用正则表达式,只需在整个字符串上使用一个正则表达式替换项,它将删除所有不需要的字符

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);
   }
}
StringBuilder结果=新建StringBuilder();
对于(inti=0;i
而不是:

keyword = keyword.replaceAll("\\\\"+c, ""+c);
使用以下命令:

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

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

谢谢,但如果我有类似“otterbox 3500系列”{{{{防水外壳\(清除)电话”的输入这行得通吗?请试试看它是否行得通。如果不行,请留下评论,我会提出其他建议。如果我的字符串中必须有/,那么它将被转义为//(,但在删除转义时,它就像/)(,是预期的吗?实际上我对你的两个非常相似的问题有点困惑,因为在你的另一个问题中,我注意到
关键字.replaceAll(“\\\\\\\\”+c,“+c”)
,这意味着一个文本退格字符,然后转义由c表示的字符。