Write a JavaScript regular expression and watch matches highlight as you type. Capture groups are broken out individually, and every flag can be toggled so you can see what g, i, m, s, and u actually change.
Write a regular expression and test it against sample text. See matches highlighted live with capture groups listed.
This uses the browser's own RegExp engine, so what you see is exactly what your JavaScript will do: no dialect translation, no surprises when you paste the pattern into your code. That matters because regex flavours genuinely differ: lookbehind, named groups, and Unicode property escapes are not portable between JavaScript, PCRE, Python, and Go.
The flag toggles earn their place. The m flag is the one people misunderstand most. It does not make dot match newlines (that is s), it changes what the ^ and $ anchors mean, so they match at line boundaries rather than string boundaries.