关于replaceFirst使用时的注意事项
replaceFirst使用时的注意事项
公司项目最近有一个开发填空题的需求,经过思索和分析,决定通过SpannableString来实现,在这个过程中
replaceFirst给了我两个坑:
坑一
通过UnderlineSpan在填空位置画下划线,并通过ClickableSpan 给填空处设置监听,点击下滑线处便呼出带有输入框的对话框输入内容之后替换到空格处
由于UnderlineSpan对空格加下划线在部分手机上实现不了,于是在填空位置首尾加上一对括号
在将输入值赋到空处出现问题
例如:
content = 我是##人,我爱##;firstValue = 中国 ;经历以下代码之后:
content = content.replaceFirst(YHAnswer.SEPARATOR, “(”+fisrtValue+")");
content 变成了 我是(中国人,我爱##);预期值是 我是(中国)人,我爱##
这不知道算不算一个bug,我研究了好久,以为是括号造成的,换成别的符号甚至汉字还是如此,但不加括号却是正常的,
最后发现原因是后面这个参数是拼接的,改成下面这样就没问题了
String before = "("+fisrtValue+")"; content = content.replaceFirst(YHAnswer.SEPARATOR, before);
坑二
在输入过程中,难免会输入特殊符号,当输入$号时,经过replaceFirst后$ 号就不见了
例如:
content = 我是##人,我爱##;firstValue = 中$$国 ;经历以下代码之后:
String before = "("+fisrtValue+")"; content = content.replaceFirst(YHAnswer.SEPARATOR, before);
content 变成了 我是(中国)人,我爱##);预期值是 我是(中$$国)人,我爱##
如果需求允许,可以直接屏蔽$,如果不允许则需要添加转义字符;
String类的replaceFirst方法不好用的原因
今天正好用String的replace方法来替换下面的AND,结果发现怎么样都不好用,随即作了一下试验,
代码一
String str = new String("AND AAE112"); str.replaceFirst("AND",""); System.out.println(str); AND AAE112
代码二
String str = new String("AND AAE112"); String out = str.replaceFirst("AND",""); System.out.println(out); AAE112
可以看出,代码二的结果是正确的,可见replaceAll并不会改变原有的str,这和PB和PL/SQL是不同的。原因应该是str指向的是一个地址。