String rst = "test";
String testStr = "123:)123";
testStr = testStr.replaceAll(myreg ,rst);
这样执行就出问题,原因是由于 replaceAll的第一个参数要求正则表达式,而myreg 中包括正则的关键字")",因此出错,哪位兄弟有没有好点的方法
---------------先抛砖引玉--------------
先通过replace方法把 myreg 中的所有关键字加上escape符号,然后再来用myreg 匹配
明天来揭帖
14 个解决方案
#1
String myreg = "\\d*:\\)\\d*";
String rst = "test";
String testStr = "123:)123";
testStr = testStr.replaceAll(myreg ,rst);
System.out.println(testStr);
#2
先通过replace方法把 myreg 中的所有关键字加上escape符号,然后再来用myreg 匹配
这种方法也不可行,String myreg = "(\\d*:)\\d*" 这样的表达式也会出现问题
#3
进来学习一下。。。
#4
那你直接使用 replace 方法就可以了,这个不是用正则表达式的
很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。
需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。
如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。
很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。
需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。
如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。
#5
String myreg = "\\d*:\\)\\d*";
String rst = "test";
String testStr = "123:)123";
testStr = testStr.replaceAll(myreg ,rst);
System.out.println(testStr);
#6
up
#7
学习了,以前都没有搞明白。
#8
String patternStr = "i.e.";
boolean matchFound = Pattern.matches(patternStr, "i.e.");// true
matchFound = Pattern.matches(patternStr, "ibex"); // true
// Quote the pattern; i.e. surround with \Q and \E
matchFound = Pattern.matches("\\Q"+patternStr+"\\E", "i.e."); // true
matchFound = Pattern.matches("\\Q"+patternStr+"\\E", "ibex"); // false
// Escape the pattern
patternStr = escapeRE(patternStr); // i\.e\.
matchFound = Pattern.matches(patternStr, "i.e."); // true
matchFound = Pattern.matches(patternStr, "ibex"); // false
// Returns a pattern where all punctuation characters are escaped.
static Pattern escaper = Pattern.compile("([^a-zA-z0-9])");
public static String escapeRE(String str) {
return escaper.matcher(str).replaceAll("\\\\$1");
}
#9
哦
#10
哦 哦
#11
我以为 replaceAll 是替换所有的,而 replace 不是替换所有的。
#12
谢谢楼上的,特别是8楼,解决了我的问题,以前还真没用过 \\Q \\E以及Matcher.replaceAll
#13
这个帖子虽然结了,需要再说一下的是:\\Q 和 \\E 在字符串中本身有 \\Q 或者 \\E 时并不是简单地头添加一个,尾添加一个的。
JDK 的 API 中有个 Pattern.quote(String) 的静态方法就是做这个处理的。转义之后可以获得原字符串所表示的正则表达式。
不过这个方法在 JDK 6 中才是健全的,JDK 6 以下都是不可靠的,如果使用 JDK 6 以下的版本,可以把 JDK 6 中的这个源代码直接拿过来用就可以了。
JDK 的 API 中有个 Pattern.quote(String) 的静态方法就是做这个处理的。转义之后可以获得原字符串所表示的正则表达式。
不过这个方法在 JDK 6 中才是健全的,JDK 6 以下都是不可靠的,如果使用 JDK 6 以下的版本,可以把 JDK 6 中的这个源代码直接拿过来用就可以了。
#14
谢谢火龙果的支持
#1
String myreg = "\\d*:\\)\\d*";
String rst = "test";
String testStr = "123:)123";
testStr = testStr.replaceAll(myreg ,rst);
System.out.println(testStr);
#2
先通过replace方法把 myreg 中的所有关键字加上escape符号,然后再来用myreg 匹配
这种方法也不可行,String myreg = "(\\d*:)\\d*" 这样的表达式也会出现问题
#3
进来学习一下。。。
#4
那你直接使用 replace 方法就可以了,这个不是用正则表达式的
很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。
需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。
如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。
很多人会把 replace 和 replaceAll 方法搞混掉,以为 replaceAll 是替换所有的,而 replace 不是替换所有的。
需要澄清一下的是,这两个方法都是对字符串全局进行替换,replace 要求的替换字符串为普通的字符串,而 replaceAll 要求的替换字符串为正则表达式。
如果不涉及正则表达式的替换,也就是纯粹的字符串替换时,应使用 replace 方法。
#5
String myreg = "\\d*:\\)\\d*";
String rst = "test";
String testStr = "123:)123";
testStr = testStr.replaceAll(myreg ,rst);
System.out.println(testStr);
#6
up
#7
学习了,以前都没有搞明白。
#8
String patternStr = "i.e.";
boolean matchFound = Pattern.matches(patternStr, "i.e.");// true
matchFound = Pattern.matches(patternStr, "ibex"); // true
// Quote the pattern; i.e. surround with \Q and \E
matchFound = Pattern.matches("\\Q"+patternStr+"\\E", "i.e."); // true
matchFound = Pattern.matches("\\Q"+patternStr+"\\E", "ibex"); // false
// Escape the pattern
patternStr = escapeRE(patternStr); // i\.e\.
matchFound = Pattern.matches(patternStr, "i.e."); // true
matchFound = Pattern.matches(patternStr, "ibex"); // false
// Returns a pattern where all punctuation characters are escaped.
static Pattern escaper = Pattern.compile("([^a-zA-z0-9])");
public static String escapeRE(String str) {
return escaper.matcher(str).replaceAll("\\\\$1");
}
#9
哦
#10
哦 哦
#11
我以为 replaceAll 是替换所有的,而 replace 不是替换所有的。
#12
谢谢楼上的,特别是8楼,解决了我的问题,以前还真没用过 \\Q \\E以及Matcher.replaceAll
#13
这个帖子虽然结了,需要再说一下的是:\\Q 和 \\E 在字符串中本身有 \\Q 或者 \\E 时并不是简单地头添加一个,尾添加一个的。
JDK 的 API 中有个 Pattern.quote(String) 的静态方法就是做这个处理的。转义之后可以获得原字符串所表示的正则表达式。
不过这个方法在 JDK 6 中才是健全的,JDK 6 以下都是不可靠的,如果使用 JDK 6 以下的版本,可以把 JDK 6 中的这个源代码直接拿过来用就可以了。
JDK 的 API 中有个 Pattern.quote(String) 的静态方法就是做这个处理的。转义之后可以获得原字符串所表示的正则表达式。
不过这个方法在 JDK 6 中才是健全的,JDK 6 以下都是不可靠的,如果使用 JDK 6 以下的版本,可以把 JDK 6 中的这个源代码直接拿过来用就可以了。
#14
谢谢火龙果的支持