有没有办法在模式匹配中重用源的消耗字符?
例如,假设我想找到一个带有正则表达式(a+b+|b+a+)
的模式
即多于一个a后跟一个以上b或反之亦然。
假设输入为aaaabbbaaaaab
然后使用正则表达式的输出将是aaaabbb
和aaaaab
如何将输出设为
aaaabbb
bbbaaaaa
aaaaab
答案 0 :(得分:6)
试试这种方式
String data = "aaaabbbaaaaab";
Matcher m = Pattern.compile("(?=(a+b+|b+a+))(^|(?<=a)b|(?<=b)a)").matcher(data);
while(m.find())
System.out.println(m.group(1));
此正则表达式使用look around机制,并会找到(a+b+|b+a+)
^
b
开头
a
预测的a
开头。输出:
b
这个正则表达式基本上需要
aaaabbb bbbaaaaa aaaaab
吗?
是的,没有^
这个正则表达式不会捕获在输入开始时放置的^
。
如果我在aaaabbb
之后添加(^|(?<=a)b|(?<=b)a)
此正则表达式匹配
(?=(a+b+|b+a+))
因此我需要将此结果限制为仅以aaaabbb
aaabbb
aabbb
abbb
bbbaaaaa
bbaaaaa
baaaaa
aaaaab
aaaab
aaab
aab
ab
开头的a
开头(但不包括b
匹配 - 所以后面看起来很完美)由b
预测的b
。
但是不要忘记放置在字符串开头的a
或a
并且不会被任何事情预测。要包含它们,我们可以使用b
。
使用此正则表达式显示这个想法可能更容易
^
。
(?=(a+b+|b+a+))((?<=^|a)b|(?<=^|b)a)
将匹配位于字符串开头的(?<=^|a)b
,或者位于b
之前a
将匹配位于字符串开头的(?<=^|b)a
,或者位于a
之前答案 1 :(得分:3)
你可以用lookbehind模拟这个:
((?<=a)b+|(?<=b)a+)
此输出
bbb aaaaa b