有没有办法在模式匹配中重用源的消耗字符?
例如,假设我想找到一个带有正则表达式的模式,(a+b+|b+a+)
即多个 a 后跟多个 b 或反之亦然。
假设输入是aaaabbbaaaaab
aaaabbb然后使用正则表达式的输出将是aaaaab
我怎样才能得到输出
aaaabbb
bbbaaaaa
aaaaab
试试这个方法
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));
这个正则表达式使用环顾机制,会(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放置在字符串开头或b之前的字符串你可以用lookbehind来模拟这个:
((?<=a)b+|(?<=b)a+)
这输出
bbb aaaaa b