Reset Stateful Regular Expressions Before Repeated Tests
Explain changing test results from global regex lastIndex and choose a repeatable validation approach.

A JavaScript regular expression can return true for a string and then false for the same string on the next call. With a global or sticky flag, test can update lastIndex, so the object carries state between calls. This guide uses a tiny synthetic example to make the behavior visible. It separates a deliberate scan from a validation check that should start at the same position each time.
Reproduce the smallest case
Use a regex object equivalent to /a/g and call test on the string "a" twice. The first successful call advances lastIndex. The next call begins from that stored position and can fail, resetting the index afterward.
Record lastIndex before and after each call. This is more informative than repeatedly changing the pattern in a tester. The pattern can be correct while the calling code uses an unintended stateful workflow.
Identify why the flag is present
The global flag is useful when scanning multiple matches. It is often unnecessary for a simple yes/no check of a single value. The sticky flag also uses lastIndex but imposes its own matching-position behavior.
Ask whether the calling function intends to continue a scan or validate a fresh input. Do not remove flags blindly from extraction code. A validation helper and a log scanner have different contracts even when they share similar pattern text.
Choose a deterministic validation boundary
For repeated independent tests, use an appropriate non-global pattern, construct a fresh object, or reset lastIndex to zero before each check. Choose one convention and keep it visible in the helper.
If you reset the index, do so before the call rather than assuming the previous failure reset it. A success can leave state behind. Also verify anchors and allowed input rules separately; fixing state does not make an incomplete validation pattern correct.
Test a sequence of inputs
Use a fixture sequence such as "a", "a", "b", "a". Check each expected result and index transition. Testing one value once can miss the repeated-call problem that appears in a form or list-processing loop.
Keep the same regex object in the test when reproducing the bug. Recreating it automatically on each row hides the state you are investigating. Then test the chosen repaired helper against the same sequence.
Document scanning separately
If a feature intentionally continues through matches, describe how and when its index resets. Do not share one mutable regex object between unrelated workflows without an explicit state boundary.
Use the regex tester to inspect the pattern and flags, then verify the repeated calls in code. A tester’s single match view may not model your application loop. The useful result is a deterministic helper for independent inputs and a separately documented stateful scan when you need one.
| Case or stage | Detail | What to notice |
|---|---|---|
| First /a/g test | "a" -> true | lastIndex advances |
| Second same-object test | "a" -> false | Starts from stored index |
| Independent validation | Reset or fresh pattern | Explicit state boundary |