- 浏览: 1324534 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
string.replaceAll中的特殊字符
string.replaceAll(String regex, String replacement)中的replacement参数即替换内容中含有特殊字符 $ \ 时,需转义。
/* * 字符串"$ \"中的$与\字符互换位置 */ public class SpecialCharReplace { public static void main(String[] args) { String str = "$ \\"; /* * string.replaceAll()中的特殊字符 $ 与 \ * * 由于 $ 字符在作为替换内容时,是一个特殊字符,指反向引用前面的分组内容,所以把 * 某字符替换成 $ 字符时,因该在前面加上转义字符 \。 * \ 字符就不用说了,本身就是转义字符,但为什么在作为替换内容时要使用四个 \ 字符 * ,这里又不是用在正则表达式里?这就是因为 \ 字符在作为替换内容里也是一个特殊字 * 符,它用来将前面讲的 $ 字符进行转换的,所以也为特殊字符。以下是replaceAll的 * 源码片断,从源码就可以看出 \$ 是两个特殊字符 * * if (nextChar == '\\') { * cursor++; * nextChar = replacement.charAt(cursor); * result.append(nextChar); * cursor++; * } else if (nextChar == '$') { * // Skip past $ * cursor++; * ... * }else { * result.append(nextChar); * cursor++; * } */ System.out.println(str.replaceAll("\\$(\\W)\\\\", "\\\\$1\\$"));// \ $ } }
Matcher对象的appendReplacement典型应用与特殊字符&\的进一步分析
问题的提出
字符串模板:
String template="尊敬的客户${customerName}你好!本次消费金额${amount},您帐户${accountNumber}上的余额为${balance},欢迎下次光临!";
其中以 ${ 开始 } 结尾的为待替换的变量域。
数据存放于Map中,key为域名,value为域值。如:
Map--
customerName = 刘明
accountNumber = 888888888
balance = $1000000.00
amount = $1000.00
请编写函数:
public static String composeMessage(String template, Map data) throw Exception
实现将任意模板字符串中的变量域,按域名替换为data中的域值。
例如,上例替换结果为:
"尊敬的客户刘明你好!本次消费金额$1000.00,您帐户888888888上的余额为$1000000.00,欢迎下次光临!"
注:如果Map中找不到域值,以空字符串""替换。
问题的解决
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 { 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(); } }
评论
4 楼
mack
2016-09-05
谢谢分享matcher.appendReplacement(sb, value);
3 楼
qingyuexiao
2014-06-16
2 楼
junJZ_2008
2009-12-16
呵呵,谢谢支持~!
1 楼
695w
2009-12-16
写的不错,支持一下,学习中!
发表评论
-
Java正则表达式
2014-03-14 10:16 1708Java正则表达式详解 作者:jzj 文 ... -
类的初始化与清理
2013-06-24 22:20 1402初始化时内存清零 当创建一个对象时,首先将在堆上为这个对象分 ... -
protected,这个错了吗?
2013-06-24 22:17 1185这几天对protected修饰符有点迷糊,随便找同事要了一本 ... -
Java中BigDecimal的8种舍入模式
2013-06-21 18:42 2134java.math.BigDecimal不可变的、任意精度的 ... -
Tomcat性能参数设置
2010-12-27 15:35 34683默认参数不适合生产环境使用,因此需要修改一些参数 1、 ... -
Java 6 JVM参数选项大全
2010-12-14 11:16 1588http://kenwublog.com/docs/java6 ... -
对象的安全构造
2013-06-21 18:43 1499在构造期间,不要公布“this”引用 一种可以将数据争用引 ... -
Java断言(assert)—— 转
2010-06-20 10:36 12026一、概述 在C和C++语言中都有assert关键,表示断言。 ... -
eclipse调试
2010-06-04 00:11 7995eclipse远程调试 在eclipse3.4前,远程调试时 ... -
protected,你真的理解了吗?
2010-05-09 17:56 2077Java中的访问控制修饰符有四个级别,但属protected最 ... -
利用反射进行深层克隆
2010-05-05 21:02 3620最近在看《effective java ... -
类与类之间的几种关系
2010-05-03 13:49 2368类和类、类和接口、接 ... -
运行java
2010-05-03 13:47 1007用javac命令编译一个打包的类时,如果没有加参数" ... -
Java内存模型与volatile
2010-04-25 13:21 18480内存模型描述的是程序 ... -
中断线程
2010-04-24 21:19 8901中断线程 线程的thread.i ... -
java中的关键字、保留字、标示符
2010-04-07 23:48 3324关键字 Java的关键字对java的编译器有特殊的意义, ... -
Java中的浮点数剖析
2010-04-07 23:27 4647定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固 ... -
线程间的同步与互斥
2010-03-23 21:29 2257线程间的同步(实指线程间的通信):一般来说,一个线程相对于另 ... -
UTF-16、UTF-16BE、UTF-16LE编码方式的区别
2010-03-23 21:20 9684import java.io.IOException; ... -
final、finally、finalize
2010-01-22 01:15 2324final关键字 先看看final关键字,它可以被用于以下几个 ...
相关推荐
string.prototype.replaceall 用于String.prototype.replaceAll的ES Proposal规范填充程序。 如果不可用或不String.prototype.replaceAll调用其“ shim”方法对String.prototype.replaceAll进行填充。 该软件包...
替换html中特殊字符 htmlStr =htmlStr.replaceAll("∀", "∀"); htmlStr =htmlStr.replaceAll("∂", "∂"); htmlStr =htmlStr.replaceAll("&exists;", "∃"); htmlStr =htmlStr.replaceAll("&empty...
主要给大家介绍了关于String.replaceAll方法,正则妙用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
public static String arabNumToChineseRMB(int moneyNum){ String res=""; int i=3; if(moneyNum==0) return "零元"; while(moneyNum>0){ res=ChineseUnit[i++]+res; res=ChineseNum[moneyNum]+res; money...
$.replaceAll( selector ) Removing $.detach( [selector] ) $.empty( ) $.remove( [selector] ) Copying $.clone( [withDataAndEvents], [deepWithDataAndEvents] )1.5∗ Events Page Load $.ready( fn() ) Event ...
js里没有replaceAll的函数,需要我们自定义 代码如下: String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); } 2、使用js的replace进行处理 代码如下: str=str....
要么无法替换掉$等特殊符号 2.要么无法忽略大小写 在海浪有帮助下,终于有了最佳实现方式:) 最佳实现方式: 代码如下:[removed] String.prototype.replaceAll = stringReplaceAll; function stringReplaceAll...
获取公私钥 Map<String, String> map = SM2Util.getKeyPairStr();...String appId = str.trim().replaceAll("-","").toUpperCase(); String appSecret = str.trim().replaceAll("-","").toUpperCase();
String.prototype.replaceAll建议 地位 冠军:Mathias Bynens(Google,@ mathiasbynens)。 该提案处于第4阶段,计划包含在ES2021中。 动机 (另请参见。) 当前,如果不使用全局正则表达式,就无法替换字符串...
本文是对JS中实现replaceAll的方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
正则表达式主要配合以下方法使用 匹配 string.matches() 分割 string.split() 替换 string.replaceAll()
微信下载录音amr转换MP3(成功测试详细 public static File ... downloadUrl = downloadUrl.replaceAll("ACCESS_TOKEN", accessToken).replaceAll("MEDIA_ID", mediaId); File file = null; File file2 = null;
String ticket = UUID.randomUUID().toString().replaceAll("\\-", ""); PasswordTicket pt = new PasswordTicket(); pt.setUser(user); pt.setTicket(ticket); pt.setCreatedDate(System....
替换 JavaScript 字符串中的所有实例。 使用 npm 安装 npm install replaceall 然后在您的节点应用程序中包含 replaceall: var replaceall = require("replaceall"); 使用替换 var result = replaceall ( ...
public static boolean validatePassword(String str) { String REG_PATTERN="^\\w{8,31}$"; Pattern pattern=Pattern.compile(REG_PATTERN); Matcher matcher=pattern.matcher(str); if(matcher.matches()...
private String stripTags(final String HTMLString) { final String noHTMLString = HTMLString.replaceAll("\\<.*?>",""); return noHTMLString; }
Console.WriteLine(ms.ReplaceAll("hello world","l","*")); //输出”he**o wor*d" ArrayList list=ms.GetPosList("hello world","l"); foreach(int pos in list){ Console.WriteLine("" + pos); } //输出2,3,9
String.prototype.replaceAll = function(str1, str2) { return this.replace(new RegExp(str1, "gm"), str2); } // 清除空格 String.prototype.trim = function() { return this.replace(/^\s*(.*?)\s+$/, "$1");
解决办法如下: 1.用ASCII码替换百分号和与符号 var remark = $("#remark").val(); remark.replaceAll("ASCII69","%").replaceAll("ASCII70","&");...//对以下在 URI 中具有特殊含义的 ASCII 标点符号,encode
由于javascript中的replace函数无法替换全部匹配的字符串,所以需要为String类增加一个方法,代码如下: 代码如下: String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) { if (!RegExp...