krabka-java-regex 1.0.8

Java's java.util.regex semantics in Rust: Pattern.matches, replaceAll and replaceFirst as JDK 25 reads them
Documentation
# Changelog

Krabka versions and tags the whole workspace as one unit, so this crate has no
release of its own. The [root changelog](../../CHANGELOG.md) records every
release that contains `krabka-java-regex`.

## [Unreleased]

### Fixed

- Bounds where Java has no atom to repeat, as in `a*{2}`, `a{2}{3}`, `{2}`
  and `(?i){2}`, repeat the empty atom as in Java, instead of the atom
  before them or the text of the braces. `(?i){2}` is no longer refused.
- A quantified group that Java repeats with its `GroupCurly` takes no empty
  iteration past its least count, so `()*\1` no longer matches the empty
  string. The groups inside it keep their text when the match backtracks
  out of the repeat, as in Java: `(?:((a))*y|a)\2` matches `aa`.
- A look-behind too large for the `regex` crate to build, such as
  `(?<=x{1,1000000000})`, compiles in milliseconds and matches on the
  backtracking matcher. `fancy-regex` built it for minutes.
- A look-behind whose maximum length overflows Java's `int`, such as
  `(?<=a*b*)`, is refused where Java then tries fewer starts than the pattern
  allows, instead of matching where Java does not.
- A look-behind that is not of one length with `\R`, a look-around, an
  atomic group or a group in it, such as `(?<=\R?x)y` or `(?<=(?=a)ab?)c`,
  compiles and matches on the backtracking matcher. `fancy-regex` cannot
  build it, so it was refused.
- A counted repeat too large for the `regex` crate to build, such as
  `x{1,1000000000}`, compiles and matches on the backtracking matcher,
  which counts its iterations. It was refused.
- A look-behind over a char past U+FFFF in the input reads as Java's
  `Behind` does, which counts its window in UTF-16 units and a class or `.`
  as one: `a.(?<=a.)x` no longer matches `a😀x`, and `.(?<=.)x` matches
  `😀x` by the lone low surrogate Java reads between the two units. Where
  the pattern has such a char from the look-behind on, Java's `BehindS`
  counts code points, and so does the crate. A wrapped look-behind maximum
  is refused only for a `BehindS`, as `findSupplementary` decides, so
  `😀x(?<=a*b*c*x)y` compiles.