6

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

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

假设输入是aaaabbbaaaaab

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

我怎样才能得到输出

aaaabbb
bbbaaaaa
aaaaab
4

2 回答 2

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));

这个正则表达式使用环顾机制,会(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

所以我需要将此结果限制为仅以它之前的结果开头的结果ab但不包括b在匹配中 - 所以向后看是完美的)并且ba.

但是我们不要忘记ab放在字符串的开头并且没有任何东西可以预测。要包括它们,我们可以使用^.


也许用这个正则表达式来展示这个想法会更容易

(?=(a+b+|b+a+))((?<=^|a)b|(?<=^|b)a).

  • (?<=^|a)b将匹配b放置在字符串开头或a之前的字符串
  • (?<=^|b)a将匹配a放置在字符串开头或b之前的字符串
于 2013-03-31T09:05:15.430 回答
3

你可以用lookbehind来模拟这个:

((?<=a)b+|(?<=b)a+)

这输出

bbb aaaaa b
于 2013-03-31T09:05:43.213 回答