读书人

String如何替换quot;\quot;之前那个帖子没说清

发布时间: 2012-01-31 21:28:41 作者: rapoo

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这样
他的实际存储就是 \\ 两个啊两个....
[解决办法]
探讨
那只是个例子,实际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 继续解释你的问题。哈哈。。
[解决办法]

探讨

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("\\", "_"));
[解决办法]
探讨

引用:

在下有一处不明,LZ从数据库中取出的字符串为何会被转义?

是打印的时候,显示的结果被转义,如果直接使用,那还是被转义前的

[解决办法]
探讨

引用:

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);
St……
……

[解决办法]
可以写个触发器嘛 每次插入值的时候就replaceAll("\","_")或者replaceAll("\","\\")一下。
[解决办法]
LZ 我这样 写你明白了吧

select translate( 'ABC5\fD6D ', '\', '_') x from dual;

结贴吧...
比刚才我说的数据字典 简单多了
[解决办法]
探讨

引用:

LZ 我这样 写你明白了吧

select translate( 'ABC5\fD6D ', '\', '_') x from dual;

结贴吧...
比刚才我说的数据字典 简单多了

我不能这么做,整个过程是这样的,一个页面查出url并显示,然后用户点击url旁边的一个链接,会把这个url传到后台……

读书人网 >J2SE开发

热点推荐