正则表达式 replaceAll的问题

时间:2021-11-12 15:39:52
String myreg = "\\d*:)\\d*";//此reg不是固定的,是来自于某个串,因此不能事先加escape符号
String rst = "test";
String testStr = "123:)123";
testStr = testStr.replaceAll(myreg ,rst);
这样执行就出问题,原因是由于 replaceAll的第一个参数要求正则表达式,而myreg 中包括正则的关键字")",因此出错,哪位兄弟有没有好点的方法

---------------先抛砖引玉--------------
先通过replace方法把 myreg 中的所有关键字加上escape符号,然后再来用myreg 匹配

明天来揭帖

14 个解决方案

#1



String myreg = "\\d*:\\)\\d*";
String rst = "test";
String testStr = "123:)123";
testStr = testStr.replaceAll(myreg ,rst); 
System.out.println(testStr);

#2


引用楼主 jianghuxiaoxiami 的回复:
String myreg = "\\d*:)\\d*";//此reg不是固定的,是来自于某个串,因此不能事先加escape符号
 String rst = "test";
 String testStr = "123:)123";
 testStr = testStr.replaceAll(myreg ,rst);
 这样执行就出问题,原因是由于 replaceAll的第一个参数要求正则表达式,而myreg 中包括正则的关键字")",因此出错,哪位兄弟有没有好点的方法

 ---------------先抛砖引玉--------------
 先通过replace方法把 myreg 中的所有关键字加上escape符号,然后再来用myreg 匹配

 明天来揭帖

先通过replace方法把 myreg 中的所有关键字加上escape符号,然后再来用myreg 匹配

这种方法也不可行,String myreg = "(\\d*:)\\d*"  这样的表达式也会出现问题

#3


进来学习一下。。。

#4


那你直接使用 replace 方法就可以了,这个不是用正则表达式的

很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。 

#5



String myreg = "\\d*:\\)\\d*";
String rst = "test"; 
String testStr = "123:)123"; 
testStr = testStr.replaceAll(myreg ,rst); 
System.out.println(testStr);

#6


引用 4 楼 bao110908 的回复:
那你直接使用 replace 方法就可以了,这个不是用正则表达式的

很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。


up

#7


引用 4 楼 bao110908 的回复:
那你直接使用 replace 方法就可以了,这个不是用正则表达式的

 很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

 需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

 如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。
学习了,以前都没有搞明白。

#8


    String patternStr = "i.e.";
    
    boolean matchFound = Pattern.matches(patternStr, "i.e.");// true
    matchFound = Pattern.matches(patternStr, "ibex");        // true
    
    // Quote the pattern; i.e. surround with \Q and \E
    matchFound = Pattern.matches("\\Q"+patternStr+"\\E", "i.e.");  // true
    matchFound = Pattern.matches("\\Q"+patternStr+"\\E", "ibex");  // false
    
    // Escape the pattern
    patternStr = escapeRE(patternStr);                       // i\.e\.
    
    matchFound = Pattern.matches(patternStr, "i.e.");        // true
    matchFound = Pattern.matches(patternStr, "ibex");        // false
    
    // Returns a pattern where all punctuation characters are escaped.
    static Pattern escaper = Pattern.compile("([^a-zA-z0-9])");
    public static String escapeRE(String str) {
        return escaper.matcher(str).replaceAll("\\\\$1");
    }

#9


引用 4 楼 bao110908 的回复:
那你直接使用 replace 方法就可以了,这个不是用正则表达式的

很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。

 哦 

#10


引用 9 楼 zl3450341 的回复:
引用 4 楼 bao110908 的回复:
 那你直接使用 replace 方法就可以了,这个不是用正则表达式的

 很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

 需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

 如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。

  哦

  哦  哦

#11


引用 4 楼 bao110908 的回复:
那你直接使用 replace 方法就可以了,这个不是用正则表达式的

很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。

我以为 replaceAll 是替换所有的,而 replace 不是替换所有的。 正则表达式 replaceAll的问题

#12


谢谢楼上的,特别是8楼,解决了我的问题,以前还真没用过 \\Q \\E以及Matcher.replaceAll

#13


这个帖子虽然结了,需要再说一下的是:\\Q 和 \\E 在字符串中本身有 \\Q 或者 \\E 时并不是简单地头添加一个,尾添加一个的。

JDK 的 API 中有个 Pattern.quote(String) 的静态方法就是做这个处理的。转义之后可以获得原字符串所表示的正则表达式。

不过这个方法在 JDK 6 中才是健全的,JDK 6 以下都是不可靠的,如果使用 JDK 6 以下的版本,可以把 JDK 6 中的这个源代码直接拿过来用就可以了。

#14


谢谢火龙果的支持

#1



String myreg = "\\d*:\\)\\d*";
String rst = "test";
String testStr = "123:)123";
testStr = testStr.replaceAll(myreg ,rst); 
System.out.println(testStr);

#2


引用楼主 jianghuxiaoxiami 的回复:
String myreg = "\\d*:)\\d*";//此reg不是固定的,是来自于某个串,因此不能事先加escape符号
 String rst = "test";
 String testStr = "123:)123";
 testStr = testStr.replaceAll(myreg ,rst);
 这样执行就出问题,原因是由于 replaceAll的第一个参数要求正则表达式,而myreg 中包括正则的关键字")",因此出错,哪位兄弟有没有好点的方法

 ---------------先抛砖引玉--------------
 先通过replace方法把 myreg 中的所有关键字加上escape符号,然后再来用myreg 匹配

 明天来揭帖

先通过replace方法把 myreg 中的所有关键字加上escape符号,然后再来用myreg 匹配

这种方法也不可行,String myreg = "(\\d*:)\\d*"  这样的表达式也会出现问题

#3


进来学习一下。。。

#4


那你直接使用 replace 方法就可以了,这个不是用正则表达式的

很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。 

#5



String myreg = "\\d*:\\)\\d*";
String rst = "test"; 
String testStr = "123:)123"; 
testStr = testStr.replaceAll(myreg ,rst); 
System.out.println(testStr);

#6


引用 4 楼 bao110908 的回复:
那你直接使用 replace 方法就可以了,这个不是用正则表达式的

很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。


up

#7


引用 4 楼 bao110908 的回复:
那你直接使用 replace 方法就可以了,这个不是用正则表达式的

 很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

 需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

 如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。
学习了,以前都没有搞明白。

#8


    String patternStr = "i.e.";
    
    boolean matchFound = Pattern.matches(patternStr, "i.e.");// true
    matchFound = Pattern.matches(patternStr, "ibex");        // true
    
    // Quote the pattern; i.e. surround with \Q and \E
    matchFound = Pattern.matches("\\Q"+patternStr+"\\E", "i.e.");  // true
    matchFound = Pattern.matches("\\Q"+patternStr+"\\E", "ibex");  // false
    
    // Escape the pattern
    patternStr = escapeRE(patternStr);                       // i\.e\.
    
    matchFound = Pattern.matches(patternStr, "i.e.");        // true
    matchFound = Pattern.matches(patternStr, "ibex");        // false
    
    // Returns a pattern where all punctuation characters are escaped.
    static Pattern escaper = Pattern.compile("([^a-zA-z0-9])");
    public static String escapeRE(String str) {
        return escaper.matcher(str).replaceAll("\\\\$1");
    }

#9


引用 4 楼 bao110908 的回复:
那你直接使用 replace 方法就可以了,这个不是用正则表达式的

很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。

 哦 

#10


引用 9 楼 zl3450341 的回复:
引用 4 楼 bao110908 的回复:
 那你直接使用 replace 方法就可以了,这个不是用正则表达式的

 很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

 需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

 如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。

  哦

  哦  哦

#11


引用 4 楼 bao110908 的回复:
那你直接使用 replace 方法就可以了,这个不是用正则表达式的

很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。

需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。

如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。

我以为 replaceAll 是替换所有的,而 replace 不是替换所有的。 正则表达式 replaceAll的问题

#12


谢谢楼上的,特别是8楼,解决了我的问题,以前还真没用过 \\Q \\E以及Matcher.replaceAll

#13


这个帖子虽然结了,需要再说一下的是:\\Q 和 \\E 在字符串中本身有 \\Q 或者 \\E 时并不是简单地头添加一个,尾添加一个的。

JDK 的 API 中有个 Pattern.quote(String) 的静态方法就是做这个处理的。转义之后可以获得原字符串所表示的正则表达式。

不过这个方法在 JDK 6 中才是健全的,JDK 6 以下都是不可靠的,如果使用 JDK 6 以下的版本,可以把 JDK 6 中的这个源代码直接拿过来用就可以了。

#14


谢谢火龙果的支持