Co-Authored-By: Claude Sonnet 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01KqJyCidz3ZgRyHABv2GVJh
1.7 KiB
1.7 KiB
regex
Companion code for the ankurm.com post "Java Regex Tutorial: Pattern, Matcher, Groups, Lookarounds
and ReDoS." Module regex in java-core-examples.
All explanation lives in the post; this module holds the runnable evidence and the captured output.
Versions
| Component | Version |
|---|---|
| JDK | 25.0.4.1+1 (Temurin, LTS) |
| JUnit Jupiter | 5.11.0 |
| Hardware | 2 vCPU x86-64 VM (timings are indicative, not a leaderboard) |
Quickstart
export JDK25_HOME=/path/to/jdk-25
./scripts/run-all.sh # rebuilds, runs the tests, regenerates everything in output/
What is in here
| File | Shows | Output |
|---|---|---|
BasicsDemo |
matches / lookingAt / find, numbered and named groups, results(), flags |
01 |
LookaroundDemo |
lookahead, lookbehind, password policy, thousands separators, lookbehind limits | 02 |
ReplaceDemo |
$1 / ${name}, the $ trap, replaceAll(Function), quoteReplacement, appendReplacement |
03 |
BlowupDemo |
timings at growing input: what the JDK tames, what it does not | 04 |
FixesDemo |
rewrite, possessive, atomic group; find() is still quadratic |
05 |
LimitsDemo |
StackOverflowError from (?:a|b)* on long input |
06 |
RegexTimeout, Safe |
a CharSequence that aborts a match at a deadline; length limit + deadline wrapper |
used by 04, 05 |
JDK Pattern.java excerpt |
the loop-memoisation gate, and the absence of any timeout API | 07 |
RegexClaimsTest |
11 assertions behind the claims above | 08 |
Every timing run is capped (2 s in BlowupDemo) by RegexTimeout, so the demos always finish.
Timings move by tens of percent between runs; the growth shape and which patterns abort do not.