java 正则表达式

chan10 2010-05-25 04:52:12
字符串String input = "aabbbccdddef"
求一个正则表达式可以分割成数组'aa','bbb,'cc,'ddd,'e,'f'
之前我写的正则表达式是:

String input = "aabbbccdddef";
String regex = "(?<!^)(?=(.)\\1+)";
String[] arr = input.split(regex);



达不到效果,还有谁能提供下正则表达式
...全文
400 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
若鱼1919 2010-12-25
  • 打赏
  • 举报
回复

String str = "aabbbccdddef";
String arr[] = str.split("(?<=(\\w))(?!\\1)");
System.out.println(java.util.Arrays.toString(arr));

今天忽然发现,貌似这样也可以
eggno8 2010-05-31
  • 打赏
  • 举报
回复
关注了就是好啊。
IceArmour 2010-05-31
  • 打赏
  • 举报
回复
学习了,,,大牛人啊
chan10 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 andy2u 的回复:]
引用 6 楼 shine333 的回复:

引用 4 楼 hbgzg3006 的回复:
Java code

Matcher m=Pattern.compile("(\\w)\\1*").matcher("aabbbccdddef");
while(m.find())
System.out.println(m.group());


这种方式也可以。


这个方式很厉害,……
[/Quote]
是的。
andy2u 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shine333 的回复:]

引用 4 楼 hbgzg3006 的回复:
Java code

Matcher m=Pattern.compile("(\\w)\\1*").matcher("aabbbccdddef");
while(m.find())
System.out.println(m.group());


这种方式也可以。
[/Quote]

这个方式很厉害,强悍 很不错啊,可以考虑下
chan10 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 shine333 的回复:]
你必须要反向引用\1,才能确定前后不一致的地方。

而它,只需要写死大写[A-Z],不需要反向引用
[/Quote]
你是对的,但我完全没理解这个原因。
chan10 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 shine333 的回复:]
必须要有匹配(match),才能split,同时split会把匹配的东西去除

而光有环视本身并不匹配任何东西
[/Quote]
24L中,举的例子,用来split的就是大写字母前的"空隙"啊。
shine333 2010-05-28
  • 打赏
  • 举报
回复
你必须要反向引用\1,才能确定前后不一致的地方。

而它,只需要写死大写[A-Z],不需要反向引用
shine333 2010-05-28
  • 打赏
  • 举报
回复
因为它没有反向引用
chan10 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 shine333 的回复:]
按我的理解:你需要反向引用,而他只要环视下一个大写。
[/Quote]
恩 是这个意思。
能不能解释下,之间的区别啊?
shine333 2010-05-27
  • 打赏
  • 举报
回复
按我的理解:你需要反向引用,而他只要环视下一个大写。
chan10 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 shine333 的回复:]
lz对lookbehind, lookahead理解错了,它可以用来测试匹配前后的内容,但是本身不算作匹配。而split需要匹配
[/Quote]
但是曾看过,一哥么回的贴子里就有,根据大写字母来split的,
用的也是(?!......) (?=......)。

private static void main(String[] args) {
String input = "ADogIsEatingPork";
String regex = "(?<!^)(?=[A-Z])";
String[] s = input.split(regex);

for (int i = 0; i < s.length; i++) {
System.out.println(s[i]);
}
}

这个输出结果就是

A
Dog
Is
Eating
Pork
shine333 2010-05-27
  • 打赏
  • 举报
回复
必须要有匹配(match),才能split,同时split会把匹配的东西去除

而光有环视本身并不匹配任何东西
shine333 2010-05-27
  • 打赏
  • 举报
回复
chan10 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 shine333 的回复:]

..................(X)..................\1

这里的\1就是反向引用,代表内容的就是X处捕获的实际值,其内容是动态的。

你之所以要反向引用,就是为了确保后面的内容和前面不一致。

上面那个例子,环视的部分是“静态的”大写
[/Quote]
意思就是,
1.环视的话,不能是动态的值?
2.我的思路是,某个空隙处 (|代表空隙),
.....(Y)|(X)\1
即后面的值要和前面的内容一致(所以用\1反向亦农),
但同时确保,空隙前面的值(即Y值)和X值又要不同。
所以写了如下思路的一个表达式(不能实现功能)
(?<!^)(?=(.)\\1+)(?<!\\1)

这样确保String input = "aabbbccdddef"
可以分割成数组'aa','bbb,'cc,'ddd,'e,'f'。
不知道,我这个思路对不对?
starsky_hf 2010-05-27
  • 打赏
  • 举报
回复
tangzhiyou_1129 2010-05-27
  • 打赏
  • 举报
回复
好好学习一下
iamback009 2010-05-27
  • 打赏
  • 举报
回复
都是牛逼的人啊
shine333 2010-05-27
  • 打赏
  • 举报
回复
..................(X)..................\1

这里的\1就是反向引用,代表内容的就是X处捕获的实际值,其内容是动态的。

你之所以要反向引用,就是为了确保后面的内容和前面不一致。

上面那个例子,环视的部分是“静态的”大写
awsbamboo115 2010-05-26
  • 打赏
  • 举报
回复
#3楼 得分:0回复于:2010-05-25 17:21:39Java code String input = "aabbbccdddef";
String regex = "(.)(?!\\1|$)";
String temp = input.replaceAll(regex, "$1,");
String[] arr = temp.split(",");
System.out.println(Arrays.toString(arr));

这个答案不错

加载更多回复(20)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧