後読みで後方参照を使用できますか?
split
私の後ろのどこにいても、キャラクターが2回繰り返されたいとしましょう。
String REGEX1 = "(?<=(.)\\1)"; // DOESN'T WORK!
String REGEX2 = "(?<=(?=(.)\\1)..)"; // WORKS!
System.out.println(java.util.Arrays.toString(
"Bazooka killed the poor aardvark (yummy!)"
.split(REGEX2)
)); // prints "[Bazoo, ka kill, ed the poo, r aa, rdvark (yumm, y!)]"
使用REGEX2
(後方参照が後読み内にネストされた先読みにある場合) は機能しますがREGEX1
、実行時に次のエラーが発生します。
Look-behind group does not have an obvious maximum length near index 8
(?<=(.)\1)
^
一般に、後方参照は任意の長さの文字列をキャプチャできるため、この種の\1
ことは理にかなっていると思います (ただし、正規表現コンパイラが少し賢ければ、この場合は(.)
長さが有限であると判断できます)。
では、後読みで後方参照を使用する方法はありますか?
そうでない場合は、このネストされた先読みを使用して常に回避できますか? 他によく使われるテクニックはありますか?