有没有办法在模式匹配中重用源的消耗字符?
例如,假设我想找到一个带有正则表达式的模式,(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