今天写程序,遇到URI的“/”转换问题,看到String有replaceAll()函数就直接用了,但eclipse却一直报错,也不知道为什么,郁闷了半天。在gg上搜索一下,看了半天,终于明白是正则表达式的问题,下面是我找的解决文章。比较乱,大家耐心看吧。
class t1 {
public static void main(String a[]) {
String s = 'E:\\jbx\\x9\\io9';
String ss;
//把路径s中的'\'换为'\\',为何还要整8个'\'?我以为4个就行了。
ss = s.replaceAll('\\\\', '\\\\\\\\ System.out.println('s= ' + s);
System.out.println('ss=' + ss);
//output:
//s= E:\jbx\x9\io9
//ss=E:\\jbx\\x9\\io9
}
}
这里的关键是String.replaceAll()是用regular expression 来作为参数的。但是java本身的字符串对于转义符\也有类似的处理。首先,java会把“\\\\”解释成一个字符串(其中包含两个char)——“\\”这个就是你在JDK的文档里看到的。
接下来,由于replaceAll是以正则表达式作为参数,所以“\\”被解释成一个regex。对于一个regex来说这就代表着一个字符,就是“\”。对后面的那个8个\来说,最终会被解释成“\\”。
换言之,假设String.replaceAll()是以普通字符串,而不是regex作为参数,那么这样写代码: String target = source.replaceAll('\\', '\\\\'); 就可以了。
===============================
在replaceAll(String,String)方法中需要特殊处理英文状态的括号,在网上找了一下,可以使用下面的写法将英文括号替换成其他字符(比如中文全角括号):str1.replaceAll("\\(","(");
在java中要将一个字符串的中$符号去除。我是这样写的:
String tmp = "-$125402.00";
tmp.replaceAll("$","");
可是执行去来的结果并没有把$去除。后来找资料才发现要这样写
tmp.replaceAll("\\$","")才可以。
String replaceAll(String regex, String replacement)中的两个参数都是regex。尤其是当第二个参数replacement是用户输入或指定的字符串时,如果其中包含regex特殊字符(主要是\和$)而不加注意,就容易导致问题引发异常。这种情况下如果只是简单的字符串替换而无需regex引擎参与的话,就不要用replaceAll好了。JDK1.5中加入了String replace(CharSequence target, CharSequence replacement),可以用它。JDK1.4或以下,自己搞一个好了,如oldReplace:http://www.javapractices.com/Topic80.cjp
在写程序的时候,需要将"\"字符写入一个文本文件,开始以为这不是个什么问题,转换一下就好了嘛,代码如下:
targetPath = targetPath.replaceAll("\\", "\\\\");
fileOperate.createFile(fileName, targetPath);
原以为没有问题,这样就可以先在读入的字符串中把"\"转换为"\\",然后在写入文本文件时就会写成"\",没想到,报如下错误:
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
回来查了资料才发现,java的replaceAll函数,使用的是正则表达式作为转换依据,而"\"在正则表达式中也是特殊字符,最后,写成下面的代码才达到了我预想的目的:
targetPath = targetPath.replaceAll("\\\\", "\\\\\\\\");
fileOperate.createFile(fileName, targetPath);
replace和replaceAll方法的区别:
主要就是后者是基于规则表达多的替换,而前者是一般的基于字符或字符序列本身的替换。
比如,可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号,replace就做不到,因为它不是基于规则表达多的替换。
分享到:
相关推荐
### Java中的`String.replaceAll()`方法详解 #### 一、引言 `String.replaceAll()`方法是Java编程语言中用于字符串操作的一个强大工具。该方法允许开发者使用正则表达式来进行模式匹配,并通过替换来修改字符串中的...
String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) { if (!RegExp.prototype.isPrototypeOf(reallyDo)) { return this.replace(new RegExp(reallyDo, (ignoreCase ? "gi": "g")), ...
4. **替换操作**:使用`replace(char oldChar, char newChar)`或`replaceAll(String regex, String replacement)`方法替换字符串中的某些字符或模式。 ```java String replaced = text.replace('p', 'x'); // ...
System.out.println(String.class.getName().replaceAll(".", "/") + ".class"); ``` 预期输出是`java/lang/String.class`,但实际上,由于`.`被当作正则表达式处理,每个`.`都被替换为`/`,所以输出会变成`///////...
Java去除字符串中空格的方法详解 Java中去除字符串中空格的方法有多种,以下是常见的五种方法: 1. 使用trim()方法:str.trim() 可以去掉字符串的首尾空格,但不能去掉中间的空格。 2. 使用replace()方法:str....
3. 新的字符串方法:如`String.join()`用于连接字符串数组,`String.replaceFirst()`和`String.replaceAll()`支持正则表达式的替换。 四、反射与注解 1. 反射API:Java 1.8增加了对反射的支持,如`MethodHandle`和...
### JSP自定义标签的`forEach`遍历与转义字符示例详解 #### 一、概述 在Java Server Pages (JSP) 开发中,自定义标签是一种强大的功能,可以让开发者封装常用的代码块,提高代码复用性,并简化页面的编写。本文将...
String.prototype.replaceAll = function(s1, s2) { return this.replace(new RegExp(s1, "gm"), s2); } ``` 这里,我们将正则表达式用String.prototype.constructor构造函数动态创建,并使用g标志来指定全局匹配...
#### 二、String 类的方法详解 ##### 1. 字符串比较方法 - **equals()**:用来判断两个字符串是否相等,仅比较内容是否相同。 - **equalsIgnoreCase()**:用来忽略大小写比较两个字符串是否相等。 - **compareTo()...
`Matcher`的主要方法包括`matches()`用于检查整个输入字符串是否匹配模式,`find()`用于查找输入中的匹配部分,`group()`获取匹配的子串,以及`replaceAll(String replacement)`和`replaceFirst(String replacement)...
#### 三、实现方法详解 以下是一个具体的示例代码片段,用于演示如何将 JSP 文件转换为静态 HTML 文件输出。 ##### 1. buildhtml.jsp 文件示例 ```jsp ;charset=gb2312" import="java.util.*,java.io.*" %> try...
#### 代码详解 ```java public static String[] getMobileAddress(String mobile) throws Exception { String[] mobileInfo = new String[2]; try { // 移除前后空格 mobile = mobile.trim(); // 检查手机...
- 查找、替换字符串:`String result = inputString.replaceAll(regex, replacement);` - 匹配字符串:`Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(inputString); boolean is...
`replaceAll`是`String`类的一个成员方法,用于替换字符串中所有匹配正则表达式的子串。在本例中,代码片段`String x = string.replaceAll("([\\!-\\@])", "$1");`展示了如何应用此方法来处理特殊字符。 ### 正则...
### MyEclipse安装插件详解 #### 一、概述 在软件开发过程中,为了提高工作效率,开发者往往会根据项目需求选择适合的开发工具,并通过安装插件来增强工具的功能。MyEclipse作为一款流行的Java集成开发环境(IDE)...
5. **替换操作**:`Matcher`类提供了`replaceAll(String replacement)`和`replaceFirst(String replacement)`方法,用于在整个输入序列或仅第一次匹配时,用新的字符串替换匹配的文本。例如: ```java String ...