本帖最后由 程金 于 2012-9-20 15:38 编辑
split("(.)\\1+")
. 表示任何一个字符,除了换行符;
(.) 表示一个组 任意一个字符都匹配这个组 (出了换行符)
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)
可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,
规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。)
这句只有一个"(.)"组,(.)第一次出现的组,所以的组号是1
\\1+
+ 表示前一个本文出现一次或多次,
\\ 第一个写斜杠转义后面一个斜杠(java字符串需要转义斜杠),就等于"\"
\1 就等于匹配组号为一的组的内容 既组(.)
这就是指匹配组组号为1的文本出现一次或多次, +表示前一个文本出现一次或多次,
整句话匹配的是:
一个任意的字符出现一次(因为组(.)匹配任何字符,除了换行符),然后紧接着又出现一次或多次 比如 88 fffff
replaceAll("(.)\\1+","$1")
$在java中有特别含义
在replaceall()等一些方法中中
用做替换的字符串可能包含到以前匹配期间所捕获的子序列的引用:
(replaceall()调用 Pattern.compile(regex).matcher(str).replaceAll(repl),其中会产生表示组的group对象)
$g 每次出现时,都将被group(g) 的计算结果替换。$ 之后的第一个数始终被视为组引用的一部分.
$1就是匹配组1的内容
"(.)\\1+" 每一个数都匹配 (.) 比如8, 重复的数才匹配 (.)\\1+ 比如88, 其中匹配组1的是8
$1 就是对前面匹配组1的内容的引用,也是8
比如你把 replaceAll("(.)\\1+","$1") 改成 replaceAll("(.)\\1+","$2")就会出现下面异常:
所以$1表示的就是匹配组1的内容;
Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 2
at java.util.regex.Matcher.group(Matcher.java:470)
at java.util.regex.Matcher.appendReplacement(Matcher.java:737)
at java.util.regex.Matcher.replaceAll(Matcher.java:813)
at java.lang.String.replaceAll(String.java:2190)
at test.Test.main(Test.java:20)
|