【JAVA】"骗人"的“replaceAll”

Java String类中有个方法叫:replaceAll,从表面上看,他的意思是把所有的regex替换成replacement。

1     public String replaceAll(String regex, String replacement) {
2         return Pattern.compile(regex).matcher(this).replaceAll(replacement);
3     }

但事实上,它并没有做到:

1     public static void main(String[] args) {
2         String str="aaa";
3         System.out.println(str.replaceAll("aa", "a"));
4     }

结果是:

aa

所以,这个方法是骗人的。

真正的replaceAll应该是这样的:

1  void replaceAll(String str, String regex, String replacement) {
2         if (str.contains(regex)) {
3             str = str.replaceAll(regex, replacement);
4             replaceAll(str, regex, replacement);
5         } else {
6             System.out.println(str);
7         }
8     }

test.java

 1 public class test {
 2
 3     public static void main(String[] args) {
 4         String str = "aaattaaaa";
 5         String regex = "aa";
 6         String replacement = "a";
 7         replaceAll(str, regex, replacement);
 8     }
 9
10     public static void replaceAll(String str, String regex, String replacement) {
11         if (str.contains(regex)) {
12             str = str.replaceAll(regex, replacement);
13             replaceAll(str, regex, replacement);
14         } else {
15             System.out.println(str);
16         }
17     }
18 }

输出:

atta

tool:

    public static String replaceAll(String str, String regex, String replacement) {
        if (str.contains(regex)) {
            str = str.replaceAll(regex, replacement);
            str=replaceAll(str, regex, replacement);
        }
        return str;
    }

纯属娱乐   :)

时间: 2024-11-09 03:13:07

【JAVA】"骗人"的“replaceAll”的相关文章

java.lang.String.replaceAll(String regex, String replacement)使用注意

java.lang.String.replace()方法的参数可以是char类型或者CharSequence类型(String实现了CharSequence接口) java.lang.String.replaceAll(String regex, String replacement)方法的参数是正则表达式和要替换后的字符串,参数regex如果输入例如"+86"或者其他带有特殊字符的字符串则会报错,需要使用特殊符号的时候需要进行转义.

Java Matcher类 replaceAll 捕获组使用及使用符号$引用捕获组

Java Matcher类 replaceAll 捕获组使用及使用符号$引用捕获组 最近看了一段解析URL以判断支付方式是在线支付还是具体哪个网银或支付宝的代码.如下 private String[] getAction(String url){ String action = null; String pluginid = null; String pattern = "/(\\w+)_(\\w+)_(\\w+).html(.*)"; Pattern p = Pattern.comp

java replace和replaceAll

replace和replaceAll是JAVA中常用的替换字符的方法 public String replace(char oldChar, char newChar)         在字符串中用newChar字符替代oldChar字符,返回一个新的字符串 public String replaceAll(String regex,String replacement)使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串. 区别: 1)replace的参数是

Java replace 和 replaceAll

Java String 的replace 和replaceAll 都是用来替换srcString的subString,但是有些不同的是,replace的参数是字符或者字符串,而replaceAll的参数可以是正则表达式. public String replace (Char old,Char newChar) {     (oldChar != newChar) {         len = .i = -[] val = (++i < len) {             (val[i] =

java中的replaceAll方法注意事项

replaceAll和replace方法参数是不同的,replace的两个参数都是代表字符串,replaceAll的第一个参数是正则表达式 replaceAll中需要注意的特殊字符: \ == \\? == [?] . == \\. 原文地址:https://www.cnblogs.com/smbin/p/8981550.html

java replaceAll之$替换

最近,在开发一个伪代码翻译工具的过程中,遇到个问题,我们在伪代码中使用spring EL的规则,将非变量限定在${"1"}中,解析后根据上下文的类型转换为相应的java类型.在规则上,我们原先要求op1 op op2之间必须有空格,但是后来发现,有些地方仍然存在着操作符和操作数之间没有空格的情况,为了尽可能多的兼容,我们选择根据上下文进行判断,适当的预处理以便后续解析不会出错,于是需要进行类似下列处理: lineText.replaceAll("#\\+", &qu

Java String.replaceAll()方法

声明  以下是java.lang.String.replaceAll()方法的声明 public String replaceAll(String regex, String replacement) 参数: regex 正则表达式,replacement 用来替换符合正则表达式的字符符 返回值 此方法返回的结果字符串 异常 PatternSyntaxException -- 如果正则表达式的语法无效. 用例 /** * 使用java正则表达式去掉多余的.与0 (1.0->1,1.010->1

Java String.replaceAll() 与后向引用(backreference)

问题 昨天看到一篇博文,文中谈到一道 Java 面试题: 给定一字符串,若该字符串中间包含 "*",则删除该 "*":若该字符串首字符或尾字符为 "*",则保留该 "*". 举几个例子(箭头左边为输入,箭头右边为输出): * --> * ** --> ** **** --> ** *ab**de** --> *abde* 我觉得应该用正则表达式来处理,但想不出正则表达式该怎么写. 第一种解答 该博文的回

java.util.regex.PatternSyntaxException: Dangling meta character &#39;*&#39; near index 0

使用repalceAll 方法出现java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0异常 代码如下: 1 @Test 2 public void testReplaceAll(){ 3 String sql = "select * from per_handle where id not in('3ce7405509414105a65e7456987e7393')"; 4 St