A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Clare0621 中级黑马   /  2013-12-24 22:42  /  5635 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Clare0621 于 2013-12-28 10:58 编辑

如题,正则表达式叠词表现形式为:"(.)\\1+"
字符串去叠词代码为:str.replaceAll("(.)\\1+", "$1")
搞不明白的是,叠词的正则表现形式“(.)\\1+”中的 \1 表示什么?不要说代表第一组这种答案
例如:给定字符串:aaabbccc,用正则去叠词具体如何匹配的??
明白人给说下。。。感激不尽!!!{:soso_e183:}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 小骗子 于 2013-12-25 01:21 编辑

你需要明白一下 正则表达式的一些基本语法;
w   表示字符
d    表示数字
s    表示空格
....

? 0-1个  比如说0-1个数字  就是d ?
+  1个以上  
*   0-n个  
{m,n}    m-n个匹配字符  还是以数字举例,4-6个数字  就是d{4,6}

[a-z]  []内的都可以取到  就是说它可以匹配小写字符 a-z 那么大写呢  同样[A-Z]  数字呢[0-9] 放在一起也可以  [a-zA-Z0-9]  -只是表示范围的意思

那么  aaaaabbbccc 怎么匹配
很多种方法   
都是字符  \\w*  \\w+
字符范围   [a-c]+  [a-c]*
字符本身   a{6}b{3}c{3}   a*b*c*  a+b+c+

dingyiok@163.com  dingyiok@sina.cn

那就可以   compile(" \\w*@[0-9a-z]+ \\.(com)|(cn)")      不过通常对名字长度也有控制  严格一些就是
^\\w{1,6}@[a-z0-9]{1,8}\.(com)|( cn)$    以1-6个字符作为用户名 +@+  1-8个小写字符或者数字+以com或者cn结尾   

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报 0 1
小骗子 发表于 2013-12-25 01:17
你需要明白一下 正则表达式的一些基本语法;
w   表示字符
d    表示数字

看你码这么多字也怪累的。。虽然没能解决我的疑问
还是谢谢了!!!
回复 使用道具 举报
本帖最后由 Kyle 于 2013-12-26 03:19 编辑

叠词的正则表现形式“(.)\\1+”中的 \1 表示什么?
不知道对不对,但我是这么理解的:
(.)代表的是一组字符,这组字符里只有一个元素,而这个元素则是任意一个字符。
至于\1,他就是这组字符的编号。 既然可以编号1,那么当然可以有编号2,比如下面这段代码:
                String regex = "(.)\\1(.)\\2";
                System.out.println("快快乐乐".matches(regex));
这里的编号1,记住的就是“快”这个字,然后叠词1次,编号2,记住的就是“乐”这个字,然后叠词1次的意思。

所以给定字符串:aaabbccc,用正则去叠词具体如何匹配的方法可以这么做
                String regex = "(.)\\1+(.)\\2(.)\\3+";
                System.out.println("aaabbccc".matches(regex));
它代表着a的叠词出现了1次到多次,b叠词了1次,c的叠词出现了一次到多次

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
Kyle 发表于 2013-12-26 03:18
叠词的正则表现形式“(.)\\1+”中的 \1 表示什么?
不知道对不对,但我是这么理解的:
(.)代表的是一组字符 ...

实际上叠词正则只要写“(.)\\1+”就行了,无需 \\2 \\3等,算了,不问了。。。谢谢!
回复 使用道具 举报
Clare0621 发表于 2013-12-28 10:57
实际上叠词正则只要写“(.)\\1+”就行了,无需 \\2 \\3等,算了,不问了。。。谢谢! ...

当然可以用(.)\\1+啊,这么做就是把aaa作为1号组出现然后这个正则这次的匹配就结束了。
然后下一次再匹配bb,就把bb重新作为1号组看待,然后就是ccc再作为1号组看待。
而1 2 3的分组的意思就是,一次性匹配结束了,而只有1号组则是上述的匹配三次不是吗?
回复 使用道具 举报
Kyle 发表于 2013-12-29 01:21
当然可以用(.)\\1+啊,这么做就是把aaa作为1号组出现然后这个正则这次的匹配就结束了。
然后下一次再匹配 ...

明白了。。。非常感谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马