String怎么替换"\",之前那个帖子没说清楚,现在重新发帖
需求是这样的,有些url有特殊字符,而这些特殊字符在windows的文件名里是不能拥有的,所以要把这样特殊字符都替换成别的字符
比如
3g.qq.com:80\forward.jsp
本地的文件名就是
3g.qq.com:80_forward.jsp
也就说给我的参数是3g.qq.com:80\forward.jsp,而我要转为3g.qq.com:80_forward.jsp
代码:
- Java code
String str = "3g.qq.com:80\forward.jsp";System.out.println(str.replaceAll("\\", "_"));报错
- Java code
Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1\ ^ at java.util.regex.Pattern.error(Pattern.java:1713) at java.util.regex.Pattern.compile(Pattern.java:1466) at java.util.regex.Pattern.<init>(Pattern.java:1133) at java.util.regex.Pattern.compile(Pattern.java:823) at java.lang.String.replaceAll(String.java:2190) at com.lmiky.test.StringTest.main(StringTest.java:46)
我知道\f, \t等是转义符,我也知道正确的应该是\\,但是我现在能得到的就是\,不知道有什么办法实现
[解决办法]
代码又错鸟...
- Java code
String str = "3g.qq.com:80\forward.jsp";System.out.println(str);
[解决办法]
public static void replaceStr(){
String str="3g.qq.com:80\forward.jsp";
Pattern p = Pattern.compile("\\t");
Matcher m = p.matcher(str);
if (m.find()){
str = m.replaceAll("_\\t");
}
System.out.println(str);
}
[解决办法]
一,你定义的常量就是错的。
你的常量内容是3g.qq.com:80\forward.jsp
在java里它就必须这么写
String str = "3g.qq.com:80\\forward.jsp";
你在str下面打印一下str就知道是怎么回事了
二,下面的str.replaceAll("\\\\", "_")对了,它首先进行java的转译,代表你要把正则表达式\\(也就是字符\) 换成 _ 之所以\在正则里需要用\\表示\是因为正则也需要转译。
[解决办法]
- Java code
String str = "3g.qq.com:80\forward.jsp"; System.out.println(str.replaceAll("\f", "_f").replaceAll("\\\\", "_"));
[解决办法]
- Java code
String str = "3g.qq.com:80\forward.jsp"; System.out.println(str.replace("\f", "_f"));
[解决办法]
....
我很无语啊...
传给你的字符串,你看到的是3g.qq.com:80\forward.jsp
实际存储的是3g.qq.com:80\\forward.jsp
懂?
[解决办法]
不管你的数据哪里取出来的
只要你Syste.out.print出来看到是3g.qq.com:80\forward.jsp这样
他的实际存储就是 \\ 两个啊两个....
[解决办法]
[解决办法]
看到这里。我估计LZ得崩溃了。。。哈哈。。
[解决办法]
直接用replaceAll("\\\\","_")就行了哈:
- Java code
public class Test14 { public static void main(String[] args) { String url = "3g.qq.com:80\\tab\\back\\forward.jsp"; url = url.replaceAll("\\\\", "_"); System.out.println("Result:" + url); }}
[解决办法]
LZ 花了两个帖子。都没把大家弄清楚。。。哈哈。。
我爱莫能助。。。我的办法也是 。。把所有可能出现的转义字符 做处理。。再替换。。。但太麻烦。。估计有简单的 函数可以实现。。。我也像看看答案。。哈哈。。
LZ 继续解释你的问题。哈哈。。
[解决办法]
[解决办法]
首先一楼的解决方案是完全正确的,要使用4个“\”,为什么要使用4个呢。
我来解释一下吧。
\\ 前面2个在Java中表示一个“\”。
在使用正则表达式替换一个"\"的时候为什么要使用4个呢。
因为“\”在正则表达式中也是一个“特殊字符”同样是需要被转义的,所以在Java中输出2个“\\”在正则表达式中才能表示为一个“\”。
楼主可以查看一下JDK API DOC文档。我下面贴一点官方的说明。
-------------------------------------------------
public final class Pattern extends Object implements Serializable正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches("a*b", "aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。
正则表达式的构造摘要
构造 匹配
字符
x 字符 x
\\ 反斜线字符
没有贴全,楼主还是自己去查询API吧。
[解决办法]
各位同学请看大屏幕:
假如字符串是:String str = "3g.qq.com:80\forward.jsp";
那么我们直接用System.out.println(str.replaceAll("\\\\", "_"));
是不行的..
接着往下看:我们在前面的字符串加一个"\"
String str = "3g.qq.c\om:80\forward.jsp";
比如这样.
但是编辑器会报错,为什么呢,因为字符串中"\"是不能存在的,只能这样
String str = "3g.qq.c\\om:80\forward.jsp";
见证奇迹的时候到了:
什么这个能存在呢 String str = "3g.qq.com:80\forward.jsp";
因为系统没把这个字符中的"\" 当成"\",而是和"\f"同时存在的,所以系统不会报错.
问题的根结找到了....
下面解决:根结这个根结:那么所有的字符串中的"\" 都不是作为"\"存在的
[解决办法]
而是和他后面的字母作为转义字符存在的.....
所以楼主首先要做的就是 让计算机承认并改正错误...
让他正确认识问题....
[解决办法]
str = "\test";看下这个字符串的长度是多少
str = "\\test";再看下这个字符串的长度是多少
然后再看下从数据库中读取出来的数据的长度是多少
然后再看下不从数据库中读取,而直接赋值的字符串的长度是多少
或者把他们当成字符数据,一个一个的元素看他们的ascii码是多少
[解决办法]
如果字符串未知并且海量的话..
小弟才疏学浅..
能想到的办法是,把所有的转义字符做成数据字典,然后根据字段先改正"\"(后面跟的字母组合"\*"肯定是转义字符) ..通过匹配把 "\" 改成"\\*" .这样计算机就不会犯错误了 ..然后
str.replaceAll("\\\\", "_")..OK
各位还有什么更好的办法,畅所欲言..
互相学习
[解决办法]
楼主 , 你可以先在 数据库里做处理 : replaceAll("\","\\")
[解决办法]
- Java code
public static void main(String[] args) { String input = "3g.qq.com:80\\forward.jsp"; Pattern p = Pattern.compile("\\\\"); Matcher m = p.matcher(input); String r = m.replaceAll("_"); System.out.println(r); Pattern p2 = Pattern.compile("\\", Pattern.LITERAL); Matcher m2 = p2.matcher(input); String r2 = m2.replaceAll("_"); System.out.println(r2); }
[解决办法]
- Java code
String str = "3g.qq.com:80\forward.jsp";System.out.println(str.replaceAll("\\", "_"));
[解决办法]
[解决办法]
[解决办法]
可以写个触发器嘛 每次插入值的时候就replaceAll("\","_")或者replaceAll("\","\\")一下。
[解决办法]
LZ 我这样 写你明白了吧
select translate( 'ABC5\fD6D ', '\', '_') x from dual;
结贴吧...
比刚才我说的数据字典 简单多了
[解决办法]