JAVA String replaceAll

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExam {
public static void main(String args[]) {
HashMap data = new HashMap();
String template = "尊敬的客户${customerName}你好!本次消费金额${amount},"
+ "您帐户${accountNumber}上的余额为${balance},欢迎下次光临!";
data.put("customerName", "刘明");
data.put("accountNumber", "888888888");
data.put("balance", "\\$1000000.00");
data.put("amount", "\\$1000.00");
try {
//尊敬的客户刘明你好!本次消费金额$1000.00,您帐户888888888上的余额为$1000000.00,欢迎下次光临!
System.out.println(composeMessage(template, data));
} catch (Exception e) {
e.printStackTrace();
}
}

public static String composeMessage(String template, Map data)
throws Exception {
String regex = "\\$\\{(.+?)\\}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(template);
/*
* sb用来存储替换过的内容,它会把多次处理过的字符串按源字符串序
* 存储起来。
*/
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String name = matcher.group(1);//键名
String value = (String) data.get(name);//键值
if (value == null) {
value = "";
} else {
/*
* 由于$出现在replacement中时,表示对捕获组的反向引用,所以要对上面替换内容
* 中的 $ 进行替换,让它们变成 "\$1000.00" 或 "\$1000000000.00" ,这样
* 在下面使用 matcher.appendReplacement(sb, value) 进行替换时就不会把
* $1 看成是对组的反向引用了,否则会使用子匹配项值amount 或 balance替换 $1
* ,最后会得到错误结果:
*
* 尊敬的客户刘明你好!本次消费金额amount000.00,您帐户888888888上的余额
* 为balance000000.00,欢迎下次光临!
*
* 要把 $ 替换成 \$ ,则要使用 \\\\\\& 来替换,因为一个 \ 要使用 \\\ 来进
* 行替换,而一个 $ 要使用 \\$ 来进行替换,因 \ 与 $ 在作为替换内容时都属于
* 特殊字符:$ 字符表示反向引用组,而 \ 字符又是用来转义 $ 字符的。
*/
value = value.replaceAll("\\$", "\\\\\\$");
//System.out.println("value=" + value);
}
/*
* 经过上面的替换操作,现在的 value 中含有 $ 特殊字符的内容被换成了"\$1000.00"
* 或 "\$1000000000.00" 了,最后得到下正确的结果:
*
* 尊敬的客户刘明你好!本次消费金额$1000.00,您帐户888888888上的
* 余额为$1000000.00,欢迎下次光临!
*
* 另外,我们在这里使用Matcher对象的appendReplacement()方法来进行替换操作,而
* 不是使用String对象的replaceAll()或replaceFirst()方法来进行替换操作,因为
* 它们都能只能进行一次性简单的替换操作,而且只能替换成一样的内容,而这里则是要求每
* 一个匹配式的替换值都不同,所以就只能在循环里使用appendReplacement方式来进行逐
* 个替换了。
*/
matcher.appendReplacement(sb, value);
System.out.println("sb = " + sb.toString());
}
//最后还得要把尾串接到已替换的内容后面去,这里尾串为“,欢迎下次光临!”
matcher.appendTail(sb);
return sb.toString();
}
}

class t1 {
public static void main(String a[]) {
String s = "E:$\\jbx\\$\\x9\\\\io9";
// s.replace("\\", "\\\\");
System.out.println("s= " + s);
String ss;
String sss;
//把路径s中的‘\‘换为‘\\‘,为何还要整8个‘\‘?我以为4个就行了。
ss = s.replaceAll("\\\\", "\\\\\\\\") ;
// String aa = "E:$jbx$x9\\io9";
sss = ss.replaceAll("\\$", "\\\\\\$");
//System.out.println(ss.replaceAll("\\$", "\\\\\\$"));
System.out.println("s= " + s);
System.out.println("ss=" + ss);
System.out.println("sss=" + sss);
//output:
//s= E:\jbx\x9\io9
//ss=E:\\jbx\\x9\\io9
}
}

import java.util.regex.Pattern;

public class Test {
public static void main(String[] args) {
String s = "select top ${fetchNum} * from tbl";
String escaped = Pattern.quote("${fetchNum}"); //=> "\Q${fetchNum}\E"
String replaced = s.replaceAll(escaped, "123");
System.out.println(replaced);
}
}

时间: 2024-10-11 05:34:01

JAVA String replaceAll的相关文章

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

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

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.replace()和string.replaceAll()的区别及用法

乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样.    public String replace(char oldChar,char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的. 如 果 oldChar 在此 String 对象表示的字符序列中没有出现,则返回对此 String 对象的引用.否则,创建一个新的

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中replaceAll()方法的"\"问题

一.前话 看似小小的一个问题,却往往足矣让我们困惑了半小时.一小时甚至更久的时间.当你得知真相后,总是会愤怒地骂道:"居然是这样!这不是坑爹么!".嗯哼,这能怪谁?只能说明自己还太嫩!So--平时还是要多注意些细节,要不断的积累不断的丰富经验,日后才能有显摆的资本. 二.天真的以为 replaceAll()这方法太常见了,一般的字符替换都好理解.但是如果你所要替换的出现了"\"的话,那可就不大一样了.例如: str = "D:\test\test2\tes

Java String类

JAVA String类[转] 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s = “Java语言”; 其实按照面向对象的标准语法,其格式应该为: String s = new String(“abc”); s = new String(“Java语言”); 只是按照面向对象的标准语法,在内存使用上存在比较大的浪费.例如String s = new String

Java String API

java.lang包: String; /*java String * String对象一旦创建其内容便不会改变 * * */ Construct: String(byte[] bytes) String(byte[] bytes, int offset, int length) String(char[] value) String(char[] value, int offset, int count) Method: String obj=new String(); obj.length(

[转]String.Replace 和 String.ReplaceAll 的区别

JAVA 中的 replace replaceAll 问题: 测试code System.out.println("1234567890abcdef -----> "+"1234567890abcdef".replace("12345", "ABCDE"));  System.out.println("1234567890abcdef -----> "+"1234567890abcde

Java String字符串的操作

在Java中,String类包含有50多个方法来实现字符串的各种操作.字符串变量必须初始化后才能使用,如果声明时赋值为null,则声明的字符串的值为null,否则表示未初始化的状态.以下介绍一些我们需要经常使用的方法. (1)字符串的连接 public String concat(String str) 该方法的参数为一个String类对象,作用是将参数中的字符串str连接到原来字符串的后面,连接字符串还可以使用+号.可以连接不同的数据类型,自动调用toString()方法,只要"+"