# replace

返回:js常见方法 | 返回:java中常见方法总结

# java_replace

  • replace(CharSequence target, CharSequence replacement) ,用replacement替换所有的target,两个参数都是字符串
  • replaceAll(String regex, String replacement) ,用replacement替换所有的regex匹配项,regex很明显是个正则表达式,replacement是字符串。
  • replaceFirst(String regex, String replacement) ,基本和replaceAll相同,区别是只替换第一个匹配项

相同点:

replace和replaceAll都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串,

不同点:

replace替换的只能是字符或字符串形式,
replaceAll和replaceFirst()是基于规则表达式(正则表达式)的替换,
replaceAll是替换所有的,而replaceFirst()仅替换第一次出现的。
另外,如果replaceAll()和replaceFirst()所用的参数据不是基于规则表达式的,则与replace()替换字符串的效果是一样的,即这两者也支持字符串的操作
还有一点注意::执行了替换操作后,源字符串的内容是没有发生改变的,这就是文章开头的问题关键所在。

String src = "ab43a2c43d";
System.out.println(src.replace("3","f"));//=>ab4f2c4fd.
System.out.println(src.replace('3','f'));//=>ab4f2c4fd.
System.out.println(src.replaceAll("\\d","f"));//=>abffafcffd.
System.out.println(src.replaceAll("3","f"));//=>ab4fa2c4fd.
System.out.println(src.replaceFirst("\\d","f"));//=>abf32c43d
System.out.println(src.replaceFirst("3","f"));//=>ab4fa2c43d.
System.out.println(src); //=>ab43a2c43d
1
2
3
4
5
6
7
8

下面尝试用提到的三种字符串替换方式替换把字符串中a替换成\a,代码如下:

System.out.println("abac".replace("a", "\\a")); //\ab\ac
System.out.println("abac".replaceAll("a", "\\a")); //abac
System.out.println("abac".replaceFirst("a", "\\a")); //abac
System.out.println("abac".replaceAll("a", "\\\\a")); //\ab\ac
System.out.println("abac".replaceFirst("a", "\\\\a")); //\abac

String a ="H\\llo";
System.out.println(a); //=>H\llo
System.out.println(a.replace("\\","\\\\")); //=>H\\llo
System.out.println(a.replaceAll("\\\\","\\\\\\\\")); //=>H\\llo
1
2
3
4
5
6
7
8
9
10

''在java中是一个转义字符,所以需要用两个代表一个。例如System.out.println( "\" ) ;只打印出一个""。但是''也是正则表达式中的转义字符(replaceAll 的参数就是正则表达式),需要用两个代表一个。所以:\\\\被java转换成\\\\又被正则表达式转换成\

back

string.replace函数是我们处理字符串需要经常用到的,replace的精妙就在于它的方便和灵活,可以配合正则表达式共同使用,以及还可以对匹配到的组进行分别处理

# 可以匹配简单的字符串

back

var str = 'hello world';
str = str.replace('world','chenlimin');
console.log(str);

// output:hello chenlimin
1
2
3
4
5

# 还可以匹配正则表达式

back

如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。

// 匹配美国电话号码
var str = 'please call 1 (555)555-5555';
str = str.replace(/(1\s?)?(\(\d{3}\)|\d{3})[\s\-]?\d{3}[\s\-]?\d{4}/g,'12530');
console.log(str);

// output:please call 12530
1
2
3
4
5
6

# 高阶用法

back

# 特殊标记

back

对于replace使用正则,约定了一个特殊标记$

  • $i (i:1-99) : 表示从左到右,正则子表达式(组)匹配到的文本
var str = 'Please make health your first priority'; //健康放在第一位
 str = str.replace(/(^\w+)(.+)/g,'$2 $1');
 console.log(str);
 // output:  make health your first priority Please
 var str = '"a","bc"';
 // 匹配所有 类似"abc" 字符并替换为 'abc'
 str = str.replace(/"([^"]*)"/g,"'$1'");
 console.log(str);
 // output: 'a','bc'
1
2
3
4
5
6
7
8
9
var str3 = '这是一段原始文本,"3c这要替换4d"!';
var newStr = str3.replace( /([0-9])([a-z])/g,"$1" );
console.log( newStr );    //输出:    这是一段原始文本,"3这要替换4"!';
1
2
3

$1表示regexp中的第一个子表示即([0-9])匹配单个数字,同理若是$2则表示第二个子表示即([a-z]);所以,’3c’这个匹配到的整体被第一个子表示说表示的’3’替换,’4d’被第一个子表示匹配的数字’4’所替换。其他几个同理可得:
(/([0-9])([a-z])/g,”$2″)—>////输出: 这是一段原始文本,”c这要替换d”!'; (3c和4d被相应的第二个子表示匹配出来的c和d替换)
(/([0-9])([a-z])/g,”$'”)—>////输出: 这是一段原始文本,”这要替换d”!这要替换”!”!'; (3c被3c右侧文本替换,4d右侧是”!替换,所以出现俩次)

  • $` (tab键上方的字符): 表示匹配字符串文本左边的文本
str = 'hello world';
str = str.replace(/world/g,'$`');
console.log(str);
//output: hello hello
1
2
3
4
  • $' : 表示匹配字符串文本右边的文本
var str = 'hello world';
str = str.replace(/hello/g,"$'");
console.log(str);
// output: world world
1
2
3
4
  • $& : 表示与正则表达式匹配的全文本
// $&
str = 'hello world';
str = str.replace(/hello world/g,"$& ,fun");
console.log(str);
// output: hello world ,fun

//    $'(‘:单引号):表示匹配字符串的右边文本。
var myString = "javascript";
myString = myString.replace(/java/,"$&$' is ")
console.log(myString)
// output: javascript is script
1
2
3
4
5
6
7
8
9
10
11
  • && : 表示$转移

# 第二个参数传入函数

back

str = 'abcdbc';
str = str.replace(/(b)(c)/g,function(){
    console.log(arguments);
    return '&&';
});
console.log(str);
// output:
// ["bc", "b", "c", 1, "abcd"]
//  0:bc"
//  1:"b"
//  2:"c"
//  3:1
//  4:"abcd"
//  ...
// ["bc", "b", "c", 1, "abcd"]
//  0:bc"
//  1:"b"
//  2:"c"
//  3:4
//  4:"abcd"
//  ...
//  a&&d&&
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var str4 = '这是一段原始文本,需要替换的内容"aa这要bbb替换ccccc"!';
var newStr = str4.replace( /[a-z]+/g,function ($0){
    var str = '';
    for (var i = 0; i < $0.length; i++) {
        str += '*';
    };
    return str;
} );
console.log( newStr );    //这是一段原始文本,需要替换的内容"**这要***替换*****"!
1
2
3
4
5
6
7
8
9

函数的第一个参数为匹配的regexp的整体,根据长度函数返回值为相应替换的文本
函数返回值表示用来替换匹配到的元素的字符串(如果匹配到的全字符串有多个,每个都会执行一次函数)
函数参数表示

  • param 1: 匹配到的字符串
  • param 2: 匹配的子字符串
  • param 3: 匹配的子字符串
  • param 4: 匹配到的字符串在字符串中的位置
  • param 5: 原始字符串
var str5 = '这是一段原始文本,需要替换的内容"3c这要替换4d"!';
var newStr = str5.replace( /([0-9])([a-z])/g,function (arg1,arg2,arg3,arg4,arg5){
 console.log( arg1 );
  console.log( arg2 );
  console.log( arg3 );
  console.log( arg4 );
  console.log( arg5 );
} );
//输出:
// 3c
// 3
// c
// 17
// 这是一段原始文本,需要替换的内容"3c这要替换4d"!
// 4d
// 4
// d
// 23
// 这是一段原始文本,需要替换的内容"3c这要替换4d"!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

第一个参数arg1表示匹配的整体,arg2表示第一个子表达式,arg3表示第二个子表达式,接下来的参数arg4是一个整数,声明了表示子匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身

# 一个简单的使用

  • 在不用函数之前,你可能会这样
str = '<div>"hello & world"</div>';
str = str.replace(/&/g,'&amp');
str = str.replace(/</g,'&lt');
str = str.replace(/>/g,'&gt');
str = str.replace(/"/g,'&quot');
str = str.replace(/'/g,'&#39');
console.log(str);
// output: &lt;div&gt;&quot;hello &amp; world&quot;&lt;/div&gt;
1
2
3
4
5
6
7
8
  • 用函数可以这样
str = '<div>"hello & world"</div>';
str = str.replace(/[<>\"\'\&']/g,function(a){
    switch(a){
    case '<':
        return '&lt;';
    case '>':
        return '&gt;';
    case '\"':
        return '&quot;';
    case '\'':
        return '&#39;';
    case '\&':
        return '&amp;';
    }
});
console.log(str);
// output: &lt;div&gt;&quot;hello &amp; world&quot;&lt;/div&gt;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 单词首字母大写

back

var str = 'please make heath your first proprity';
    str = str.replace(/\b\w+\b/g,function(word){
    return word[0].toUpperCase()+word.slice(1);
});
console.log(str);
// output: Please Make Heath Your First Proprity
1
2
3
4
5
6
var str = 'please make heath your first proprity';
    str = str.replace(/(^|\s)([a-z])/g,function(word,p1,p2){
    return p1 + p2.toUpperCase();
});
console.log(str);
// output: Please Make Heath Your First Proprity
1
2
3
4
5
6