Case conversion, diffing, counting, escaping and whitespace cleanup for text.
Lists of text arrive in bad shape. An email column pasted out of a spreadsheet has trailing spaces on every row. A log excerpt has duplicate lines. A list copied from a PDF has hard line breaks in the middle of sentences. None of these are hard problems, but doing them by hand across four hundred lines is miserable, and reaching for a scripting language for a one-off cleanup is slower than it sounds.
Everything here operates on the text in the box above. Each button is one transformation, applied to the whole text, and every one of them can be undone. Work in small steps and check the counts as you go.
Order matters more than people expect. Trimming before de-duplicating is almost always right: two lines that differ only by a trailing space are not duplicates until you trim them, so de-duplicating first silently leaves them both in place.
Similarly, remove empty lines before sorting if you want a compact result, since blank lines sort to one end and leave a gap you then have to remove anyway.
The statistics panel updates as you type. Most of it is self-explanatory, but the character count deserves a note, because it is the number most tools get wrong.
Computers store text as a sequence of code units, and a single visible character can occupy several of them. The emoji 👩💻 is one thing you can see, but it is built from a woman emoji, an invisible joiner and a laptop emoji — five code units in total. A naive counter reports 5. This tool counts grapheme clusters, which is the technical name for "what a person would call one character", so it reports 1.
The same logic applies to accented characters written with combining marks, and to flag emoji. If you are counting against a limit that a different system enforces — a database column, an SMS gateway, a social platform — be aware that the other system may well count differently.
The extraction buttons pull emails, URLs or numbers out of unstructured text and give you them as a clean list, de-duplicated and in order of appearance.
URL extraction strips trailing sentence punctuation, so "visit https://example.com." yields the URL without the full stop, and it stops at a closing parenthesis so a URL inside brackets comes out clean.
Email matching is deliberately pragmatic rather than exhaustive. The complete specification for a valid email address permits constructions that essentially nobody uses, and matching all of them produces worse results on real text than a tighter pattern does.
Converting "hello world" to camelCase is easy. Converting parseHTTPResponse2Json is where tools disagree, because the boundaries are implied rather than marked.
This tool splits on three signals: any run of non-letter, non-digit characters (spaces, hyphens, underscores, punctuation); a lowercase letter or digit followed by an uppercase letter; and a run of uppercase letters followed by an uppercase-then-lowercase pair. That last rule is what correctly separates "HTTP" from "Response" in parseHTTPResponse, rather than producing p-a-r-s-e-h-t-t-p-response or treating the whole acronym as one word glued to the next.
The result is that parseHTTPResponse becomes parse_http_response in snake case and parse-http-response in kebab case, which is what most style guides expect.
Title case capitalises the first letter of every word and lowercases the rest, so "hello WORLD" becomes "Hello World". It does not know about style-guide rules that keep short words like "of" and "the" lowercase, because those rules vary by publication and applying one silently would be a guess.
Sentence case lowercases everything and then capitalises the first letter of each sentence, detecting sentence ends at full stops, question marks and exclamation marks, including their full-width CJK equivalents. It is the right choice for text that arrived in ALL CAPS.
The slug transform produces a URL-safe identifier: lowercase, accents folded to their base letters, and every run of non-alphanumeric characters replaced with a single hyphen.
Accent folding is done by decomposing characters and removing the combining marks, so "Café Crème" becomes "cafe-creme" rather than "caf-cr-me". Dropping the accented letters entirely is a common bug in slug generators and it mangles names.
Leading and trailing separators are stripped, and emoji and other symbols are removed, since they have no useful URL representation.
Find-and-replace has two modes. Literal mode — the default — escapes every special character, so searching for "a.b" finds exactly "a.b" and not "axb". Regex mode passes your pattern through as-is.
Every pattern you type is compiled inside a guard. If it is invalid, you get a message explaining the problem and your text is untouched. This matters more than it sounds: typing a regular expression is an incremental process, and a lone "(" is a perfectly normal intermediate state on the way to a working pattern. A tool that throws an unhandled error at that moment — or worse, clears the box — is unusable.
In regex mode, replacement supports capture groups with $1, $2 and so on. Reformatting dates is the canonical example: find (\d{4})-(\d{2})-(\d{2}) and replace with $3/$2/$1 to turn 2024-01-02 into 02/01/2024.
The "Whole word" option wraps your search in word boundaries, so searching for "cat" matches the word cat but not the "cat" inside "concatenate".
It composes with both modes. In literal mode your text is escaped first and then bounded; in regex mode your whole pattern is bounded as a group, so alternations like cat|dog behave as you would expect rather than binding the boundary to only the first branch.