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

{}文字は正規表現の特殊文字です。繰り返しの範囲を示します(たとえば、3〜5秒の後ab{3,5}に一致する文字)。ab

に応じて、正規表現でこの文字をエスケープする必要があります\{


あなたの特定のケースでは、シーケンスの一部で正規表現の置換を繰り返し使用することで、自分自身にとって非常に困難な(そして非効率的な)ものになっていると思います。

正規表現を使用する場合は、文字列全体で1つの正規表現置換を使用するだけで、不要な文字がすべて削除されます。例えば

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

文字列を繰り返し処理して、望ましくない文字を1つずつ検出する場合は、この繰り返しを実行して出力を作成し、省略したい文字をスキップします。例えば:

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 に答える