java字符串使用replace、replaceall、split处理`’+‘、’|‘、 ’*‘、’.‘、’?‘、'$'等字符无效的解决办法(阐释原因和解决方案,实测有效)

背景介绍

  在用Java做一个自动字段解析拆分的应用时,发现以竖杠(’|’)分隔的字符串无法通过split进行分隔无效,但并未报异常,字符串全部以逗号分隔成一个一个的字符。因此查了一下材料,发现凡是通过正则表达式匹配的函数,对于一些特殊符号都无法正常识别和处理,如’+‘、’|‘、 ’*‘、’.‘、’?‘、'$'。解决办法很简单,及时在特殊字符的外面,增加一个中括号'[]',如将’|'替换为'[|]'即可。深层次的原因是因为正则表达式将这些符号作为逻辑运算的一部分,如*在正则表达式中代表的是0->n的任意匹配,+则是1->n的匹配,?则是0->1的匹配,|则为或的逻辑符号等等。

java字符串使用replace、replaceall、split处理’+‘、’|‘、 ’*‘、’.‘、’?‘、'$'等字符无效的2种异常表现方式:
  1. java字符串使用replace、replaceall、split处理’|‘、’.‘、'$'等字符无异常,但结果未达到预期;
    // | 分隔符时如下
    ,A,c,t,i,o,n,|,C,o,m,e,d,y,|,R,o,m,a,n,c,e,
    
    // $分隔时如下
    Action$Comedy$Romance
    
  2. java字符串使用replace、replaceall、split处理’+‘、’?‘、'*'等字符报异常,无法正常执行;
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0
? // 此处根据字符不同,提示的会有所差异
^
  at java.util.regex.Pattern.error(Pattern.java:1957)
  at java.util.regex.Pattern.sequence(Pattern.java:2125)
  at java.util.regex.Pattern.expr(Pattern.java:1998)
  at java.util.regex.Pattern.compile(Pattern.java:1698)
  at java.util.regex.Pattern.<init>(Pattern.java:1351)
  at java.util.regex.Pattern.compile(Pattern.java:1028)
  at java.lang.String.replaceAll(String.java:2223)
  at com.troll.bigdata.component.example.elasticsearch.ExampleTest.main(ExampleTest.java:22)

案例一、java使用split不能处理竖杠(’|’),加好(’+’)等字符

public class ExampleTest {
    public static void main(String[] args) {
        // 字符串
        String str = "Action|Comedy|Romance";

        // 字符串split示例
        String[] e1 = str.split("|");
        for (String s : e1) {
            System.out.print(s+" ");
        }
        System.out.println();
    }
}

输出效果如下:

A c t i o n | C o m e d y | R o m a n c e 

解决办法:
对于特殊符号,在特殊字符外加[],如: | => [|] , % => [%], + => [+]

public class ExampleTest {
   public static void main(String[] args) {
       // 字符串
       String str = "Action|Comedy|Romance";

       // 字符串split示例
       String[] e1 = str.split("|");
       for (String s : e1) {
           System.out.print(s+" ");
       }
       System.out.println();
   }
}

输出效果如下:

Action Comedy Romance 

案例二、java使用replcaceall或replace处理字符串时,无法正常替换

public class ExampleTest {
    public static void main(String[] args) {
        // 字符串
        String str = "Action|Comedy|Romance";
        
        // 字符串符号替换示例
        String e2 = str.replaceAll("|",",");

        // 打印字符串
        System.out.println(e2);
        
    }
}

输出效果如下:

,A,c,t,i,o,n,|,C,o,m,e,d,y,|,R,o,m,a,n,c,e,

java无法使用特殊符号进行replcace和replaceall解决办法:

public class ExampleTest {
    public static void main(String[] args) {
        // 字符串
        String str = "Action|Comedy|Romance";
        
        // 字符串符号替换示例
        String e2 = str.replaceAll("[,]",",");

        // 打印字符串
        System.out.println(e2);
        
    }
}

输出效果如下:

Action,Comedy,Romance

附加

猜你喜欢

转载自blog.csdn.net/myhes/article/details/106070579
今日推荐