Java正则表达式:如何在模式匹配中重用消耗的角色?

时间:2013-03-31 08:55:00

标签: java regex

有没有办法在模式匹配中重用源的消耗字符?

例如,假设我想找到一个带有正则表达式(a+b+|b+a+)的模式 即多于一个a后跟一个以上b或反之亦然。

假设输入为aaaabbbaaaaab

然后使用正则表达式的输出将是aaaabbbaaaaab

如何将输出设为

aaaabbb
bbbaaaaa
aaaaab

2 个答案:

答案 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+)

  • 存在于输入的<{1}}
  • ^
  • 预测的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

但是不要忘记放置在字符串开头的aa并且不会被任何事情预测。要包含它们,我们可以使用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