String中替换特殊字符的问题

fthmko 2009-01-10 05:49:12
我做的一个小程序,可以批量的重命名文件。
在替换指定字符时,出现一些问题,特来向大家求助!
语句为:result = now.replaceAll(before, after);

但是,当文件名中包括 .$^+(){}[] 这些符号时,都会出现问题。

其中$会在替换结果再加一个替换结果,^会在开头加一个。
比如,hello$everyone 替换$为X的结果是 helloXeveryoneX

其他的会在每两个字符间加上替换结果! hi+ok 替换+为X 会得到 XhXiX+XoXkX

这太让人疯狂了!谁能给个解决办法呀。。。实在是不想先转义再替换再转义这样。。。
...全文
1039 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fthmko 2009-01-11
  • 打赏
  • 举报
回复
仅仅是字符串完全匹配,不用通配符。
  • 打赏
  • 举报
回复
你还是没说清楚你需要怎么替换,需求带一些通配符之类的条件,还是字符完全匹配才进行替换?
fthmko 2009-01-11
  • 打赏
  • 举报
回复
其实程序很简单啦。在程序中,打开一个文件夹,读取文件列表,之后使用替换功能,把指定的字符串替换成另外的字符串,然后批量重命名。

但是遇到文件名中有些特殊的符号就出问题啦,尤其是(),很常见的。

用Pattern可以替换()么?如何使一个文件名中出现的所有匹配串都被替换呢?

我现在只会用replaceall()来替换,或者是用contains()判断还有没有,然后用replace()替换。

有什么别的方法也可以的,我虽说会的不多,不过还不笨。
  • 打赏
  • 举报
回复
如果你使用一种模式进行批量替换的话,建议使用 Pattern 类创建一个正则表达式,如果你使用 replaceAll 的话,
每做一次替换都会去创建一个 Pattern 对象,用完后就扔掉了。

至于为什么多次替换用 Pattern 呢,可以去看一下 java.lang.String#replaceAll 和 replace 两个方法的实现你就明白了。

至于其他的,由于我不知道你具体要做什么,有什么要求,也没有办法回复了。
  • 打赏
  • 举报
回复
说实在的,没看懂你具体要做什么!
fthmko 2009-01-10
  • 打赏
  • 举报
回复
感谢热心的竹子!

可是,我并不知道是否替换的串里面有什么,我可能替换 i+ ,也可能替换hi+。这样,又变成先对输入的串进行过滤。

另外,用reaplaceall来代替reaplace的话,有时候很多文件需要进行重命名,就必须替换多次,还需要注意看找到的数量直到是0为止。
文件较少这样是无所谓的,但是多的话,比如1000个,速度慢几倍,有些难以接受了。

除非replace函数可以告诉我,找到了没有,可惜它不肯。只能用contains()了,这个也是正则表达式吗?
老紫竹 2009-01-10
  • 打赏
  • 举报
回复
hi+ok 替换成 hiok

可以用

"hi+ok".replaceAll("\\+","");

这样的正则就可以了!
老紫竹 2009-01-10
  • 打赏
  • 举报
回复
而且你替换时,可以在他们前面加上

比如

$ 你换成 \\$
前面加上\ 就行了

比如()[].*$等这几个都在前面加上这个“转义”就OK了!
老紫竹 2009-01-10
  • 打赏
  • 举报
回复
可以批量的重命名文件。

文件名能有多长? 我并不认为replaceAll比replace速度快。你测试过?
qusic 2009-01-10
  • 打赏
  • 举报
回复
关键是replace如果用在比较长的字符串中替换所有的效率很低啊!!
有没有更好的办法?
老紫竹 2009-01-10
  • 打赏
  • 举报
回复
老紫竹 2009-01-10
  • 打赏
  • 举报
回复
result = now.replaceAll(before, after); // 这个是正则替换
result = now.replace(before, after); // 这个就是普通的替换


老紫竹 2009-01-10
  • 打赏
  • 举报
回复
replace不就行了,不要用All

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧