Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does cleaned café fail a JavaScript word-character regex?

In our tests, /^\w+$/u still rejects café and Greek letters. /^\p{Letter}+$/u accepts them. The digit-and-underscore control does the opposite. Cleanup removes the selected gap; it does not choose your identifier policy.

Tested October 14, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked accented word

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Marked accented word
direct string / keep / invisible true
"caf​é"
U+0063 U+0061 U+0066 U+200B U+00E9
"café"
Removed 1 invisible character
{"word":false,"letters":false,"wordMatches":["caf"],"letterMatches":["caf","é"]}
{"word":false,"letters":true,"wordMatches":["caf"],"letterMatches":["café"]}
Plain accented word
direct string / keep / invisible true
"café"
U+0063 U+0061 U+0066 U+00E9
"café"
No selected invisible characters found
{"word":false,"letters":true,"wordMatches":["caf"],"letterMatches":["café"]}
{"word":false,"letters":true,"wordMatches":["caf"],"letterMatches":["café"]}
Greek letters
direct string / keep / invisible true
"αβ"
U+03B1 U+03B2
"αβ"
No selected invisible characters found
{"word":false,"letters":true,"wordMatches":[],"letterMatches":["αβ"]}
{"word":false,"letters":true,"wordMatches":[],"letterMatches":["αβ"]}
Digit underscore
direct string / keep / invisible true
"A_1"
U+0041 U+005F U+0031
"A_1"
No selected invisible characters found
{"word":true,"letters":false,"wordMatches":["A_1"],"letterMatches":["A"]}
{"word":true,"letters":false,"wordMatches":["A_1"],"letterMatches":["A"]}

Two validators disagree after the selected gap is gone

The marked accented word begins as caf, a selected U+200B and é. Neither anchored validator accepts it before cleanup. After deletion, the Unicode Letter expression accepts the complete café, while the word shorthand continues to reject it. The plain accented reference gives that same disagreement without an edit. Greek αβ also passes only the Letter expression. Conversely, A_1 passes the word expression but fails the letters-only expression because its underscore and digit are outside that selected property. The observer also saves unanchored match arrays. Those arrays show caf as the word match and café as the letter match after cleanup, locating exactly what each expression consumes instead of treating a boolean as an explanation.

Unicode mode does not turn every shorthand into a language validator

Both expressions use the u flag, so their difference is not caused by accidentally omitting that flag. The specified word shorthand and the explicit Letter property still define different sets. Our earlier category guide checks which characters the cleaner selects; here the categories belong to the destination regex and govern accepted content. Our segmentation guide instead measures word boundaries under an internationalization API. None supplies the application’s permitted identifier grammar. We do not test combining marks, script restrictions, confusable detection or language-specific spelling. In particular, a decomposed accent can include a nonletter mark, so the letters-only result for the precomposed é cannot be generalized to every equivalent-looking spelling.

Write down the allowed content instead of deleting legitimate letters

When a validator rejects visibly correct language, compare its actual character policy with the intended input. Keep the original spelling and inspect selected gaps separately from legitimate accented or Greek letters. If the destination intends letters plus marks or digits, construct and test that precise policy rather than assuming either example here is a universal solution. The digit-and-underscore control prevents the misleading conclusion that one expression is simply stricter in every direction: the accepted sets differ. Our reproducer uses four authored strings and exact matches; it does not enforce account names or prove cross-script safety. Verify final acceptance in the real destination before attributing every rejection to a hidden character or replacing useful text with ASCII.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

ECMAScript string operations provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.