黑马程序员技术交流社区

标题: 正则表达式 [打印本页]

作者: 黑马-刘浩    时间: 2012-9-20 13:48
标题: 正则表达式
正则表达式中的分组:
   978168804fffffjigerigggglk  分割字符串中使用组split("(.)\\1+");如何理解??
    而在替换时:replaceAll("(.)\\1+","$1") ;$1-->什么意思???
作者: 程金    时间: 2012-9-20 15:01
本帖最后由 程金 于 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)


作者: 崔朋朋    时间: 2012-9-20 17:52
用正则表达式进行字符串匹配时, 可对字符串进行分组匹配。分组规则是:从左向右,第一个出现的左括号为第1组,第二个出现的左括号为第2组...依次编号
而 split("(.)\\1+"); 这句中字符串 "(.)\\1+"  只有一组即(.) 编号为第1组


.           表示任意一个字符,除换行符
\\1         第一个 \ 用来转义紧跟在后边的字符,转义后即为\1,\1表示第1组即(.);
+           表示前一个字符出现一次或多次,在这里即是\1出现一次或多次。\1就是(.)  
"(.)\\1+"   整体表示任意一个字符出现多次,至少出现两次


$在java中有特别含义,在这里 $1就是要匹配第 1 组即(.),$2 就是要匹配第二组,本例中没有第2组
replaceAll("(.)\\1+","$1");就是用后边的串替代前边的串,本例中即用(.)来替代多个(.)。


总结:
本例的作用就是要清除字符串中重复出现的字符,保证任何字符只出现一次  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2