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表示的字符。