1、在 Java 字符串的:
1 2 | public String replaceFirst(String regex, String replacement) public String replaceAll(String regex, String replacement) |
两方法的第二个参数中是可以用 $1, $2 ... 来引用第一个参数的括号分组的,简单 Java 示例代码如下:
1 2 | "abc def" .replaceFirst( "(\\w+)\\s+(\\w+)" , "$2 $1" );? // 结果为 def abc "abc def aaa bbb" .replaceAll( "(\\w+)\\s+(\\w+)" , "$2 $1" );? // 结果是 def abc bbb aaa |
2、在正则表达式外是用 $1, $2 ... 来进行?后向引用,如果是在正则表达式中就需要用 \1, \2 ... 的形式来进?后向引用。
下面例子,替换重复出现的两位数及之间的内容:
1 | "xx12abcd12345" .replaceAll( "(\\d{2}).+?\\1" , "" );? // 结果为 xx345 |
3、例题
// 1**3 -> *1****3*, 中间原始的"**"不替换
private static String markNums(String str) {
// ?【Regex后向引用 $1, $2...】:http://php-note.com/article/363.html
return str.replaceAll("(\\d+)","\\*$1\\*");
}
// ?Regex后向引用:http://php-note.com/article/363.html
// ?regex外,引用分组使用【$1】, regex内使用【\\1】, 类比HJ20, HJ96
// ?条件3:排除以下规则(.{3,})不可重复!reg分组:(..);
// 不能有长度大于2的不含公共元素的子串重复 (注:其他符号不含空格或换行)
String reg2 = ".*(.{3,}).*(?=\\1).*"; // ?"(?=\\1)":后面匹配组1
Pattern pattern2 = Pattern.compile(reg2);
Matcher matcher2 = pattern2.matcher(s);
if (!matcher2.find()) {
System.out.println(OK);
continue;
} else {
System.out.println(NG);
continue;
}
|