java 变态正则表达式

来源:百度知道 编辑:UC知道 时间:2024/06/18 10:55:21
题目:
今天笔试的时候遇到一个题,结果现在还迷糊呢。特向大家请教,寻求帮助。
题目:已知一个字符串字符串"aaaabbbbbcccbbbbbd",要求最终排序是
bbbbb
bbbbb
aaaa
ccc
d
根据长度有多到少来排序。

答案如下:
import java.util.*;

public class Demo {
public static void main(String[] args) {
String str = "aaaabbbbbcccbbbbbd";
String[] strs = str.split("(?<=(\\w))(?!\\1)");
Arrays.sort(strs, new Comparator<String>() {
public int compare(String a, String b) {
return b.length() - a.length();
}
});
for (String s : strs) System.out.println(s);
}
}

能否解释一下以下正则表达式,具体是怎么拆分的
String[] strs = str.split("(?<=(\\w))(?!\\1)");
本人明白 正则表达式的基本使用。。。

请解释 上面"(?<=(\\w))(?!\\1)" 这个拆分过程。。

谢谢

pur_e 14:41:48
选13,后向引用
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<=(\\w))表示匹配\w后面的位置
(?!\\1)表示不是前面分组(\\w)的位置
pur_e 14:45:07
有问题吗
bossjzl17 14:47:07
(?!\\1)表示不是前面分组(\\w)的位置?
pur_e 14:45:52
\1\2\3等等可以表示前面的分组
分组就是用小括号括起来的

"(?<=(\\w))(?!\\1)"拆分如下:
1.(?<=(\\w))
(?<=X) X,通过零宽度的正 lookbehind
2.(?!\\1)
(?!X) X,通过零宽度的负 lookahead

lizard1861 - 回答基本正确
(?<=(\\w))就是前一个字符要是合格的标示符字符。(但是不提取)
(?!\\1) 而这个的后边要和前面的不同。
过程就是
aaaA
bbbbB
ccC
bbbbB
D
按我大写的拆的
--------------------------------
修正一点,不是按照大写的字母分割,而是按照一个没有宽度的位置,就是a和b中间的位置

(?<=(\\w))就是前一个字符要是合格的标示符字符。(但是不提取)
(?!\\1) 而这个的后边要和前面的不同。
过程就是
aaaA
bbbbB
ccC
bbbbB
D
按我大写的拆的

JAVA的细节不清楚,我就普遍的去理解,挑理解错的说吧。