Logo

MonoCalc

/

Hashtag Extractor

Social Media
Everything stays in this browser. Nothing is uploaded, stored or remembered between visits.

Unique tags

0

case-insensitive

Total occurrences

0

every time a tag appears

Skipped markers

0

none

Protected stretches

0

none

What was read, and what was not

Your text exactly as typed, with each decision marked. Hover a muted run to see why it was passed over.

#tagextracted
addressinside a URL, email or code
#2024skipped, with a reason

Paste some text above and it will appear here with every tag marked.

A run of markers is read after the last one, so ##Friday is #Friday. A marker only opens a tag when the character before it is not part of a tag body, which is what keeps C#, F# and item#3 out of the list.

0 tags

TagOccurrencesCharactersAlso seen asCopy
No hashtags found yet.

Tags, reassembled

One entry per unique tag, in the order the table is sorted.

0 characters in this block, separator included — counted as grapheme clusters, the way a reader counts them. Joined with " ".

The text without its tags

Every extracted tag removed and the whitespace left behind collapsed to single spaces. Skipped markers and protected stretches stay where they were, because neither was treated as a tag.

0 characters without the tags, 0 with them.

Will this fit?

Your whole text, tags included, measured against a limit you set.

Default: 2,200 — recorded 2026-09-14, verify against the platform's current published limit.

Whole text

0

characters

Tag block

0

separator included

Without tags

0

characters

Your limit

2,200

editable above

These numbers were recorded, not verified
Every starting value above was written down on 2026-09-14 and none of them was checked against a platform's own published documentation — external domains were unreachable from the environment this tool was built in. No platform name is attached to any of them for the same reason. Limits change without notice, so treat each as a starting point and edit the field to match whatever you are actually posting into.

About This Tool

Hashtag Extractor – Pull Every Tag Out of Any Text

Paste a caption, a draft post, a spreadsheet column or a post you copied from somewhere else, and this hashtag extractor gives you back every tag in it — de-duplicated, counted, ordered and ready to copy out in whatever shape you need. The whole job happens in your browser. Nothing is uploaded, nothing is stored, and no network request of any kind is made. The tool reports what is in your text and how long it is; it does not suggest tags or comment on them.

Why a hand-written regular expression gets this wrong

The obvious pattern, #[A-Za-z0-9_]+, fails in two directions at once. It silently drops every non-Latin tag — #日本, #مرحبا, #новости, #हिंदी — because the character class has no letters outside ASCII in it. And it happily picks up things that are not tags at all: the fragment of https://example.com/docs#installation, the local part of hi#dev@example.com, the sharp in C# and the number in item#3.

This tool is built the other way round. The grammar uses Unicode property escapes, so letters in every script are letters and combining marks stay attached to their base letter. Before a single tag is read, the text is scanned for stretches that are off limits — web addresses, email addresses and, if you switch it on, code — and any match inside one is discarded. The text itself is never rewritten, so the original string survives intact for the preview.

The preview shows the decisions, not just the answers

Below the input your text is redrawn exactly as typed, with every judgement marked: extracted tags highlighted, protected stretches muted under a dotted underline reading inside a URL — not extracted, and skipped markers struck through with the reason attached. It answers “why didn’t it pick up #42?” without you having to ask. Each piece is an ordinary text node, so nothing pasted in can become markup or a live link.

The rules, spelled out

A marker opens a tag only when the character before it is not part of a tag body — that is what keeps C#, F# and a#b out. A run of markers collapses and the body is read after the last one, so ##Friday is #Friday. The body runs until the first character that is not a letter, combining mark, digit or underscore, which is why #foo-bar gives #foo and #end. gives #end. A body with no letters in it is not a tag, so #2024 and #___ are rejected — but #Top10 is fine, and every rejection appears in a short skipped list rather than vanishing. The fullwidth # common in Japanese, Chinese and Korean posts is always a marker; ♯ and ⌗ sit behind a toggle that is off by default.

Counted the way a reader counts
Every length here is a count of grapheme clusters, measured with Intl.Segmenter on a locale pinned to English so the same text can never count differently on two machines. String.length would call #👨‍👩‍👧 eight characters; a reader calls it two.

Grouping, ordering and getting the tags back out

#Coffee, #coffee and #COFFEE are one row counted three times. The matching key is normalised to NFC and lower-cased with a pinned locale, so an accent typed as a combining mark groups with the precomposed form and a Turkish keyboard cannot change the result. The spelling shown is always the first one you typed, with the alternates listed underneath. Three sort orders are offered — first appearance, most frequent and alphabetical — and each is a complete order, with first appearance breaking every tie, so the same input always produces the same list.

The output box rebuilds the tags with your choice of separator, with or without the marker, as typed or lower-cased, and exports to .txt, .csv and .json. The CSV is quoted per RFC 4180 and any cell opening with =, +, - or @ is neutralised, so a tag like #=cmd arrives in a spreadsheet as text rather than a formula. Beside it sits the caption on its own, tags stripped and whitespace collapsed, plus a “will this fit?” panel whose character limit is an editable number carrying the date it was written down — platform limits change without notice.

Frequently Asked Questions

Is the Hashtag Extractor free?

Yes, Hashtag Extractor is totally free :)

Can I use the Hashtag Extractor offline?

Yes, you can install the webapp as PWA.

Is it safe to use Hashtag Extractor?

Yes, any data related to Hashtag Extractor only stored in your browser (if storage required). You can simply clear browser cache to clear all the stored data. We do not store any data on server.

How does this hashtag extractor work?

You paste any block of text and the whole job happens in your browser. The text is first scanned for stretches that are off limits — web addresses, email addresses and, if you ask for it, code — then every hashtag outside those stretches is read with a Unicode-aware grammar, de-duplicated, counted and listed. Nothing is uploaded and no network request of any kind is made. The tool reports what is in your text; it does not suggest tags, invent them or comment on them.

Why was a hashtag inside a link not picked up?

Because the fragment of a web address is not a hashtag. In https://example.com/docs#installation the #installation is part of the address, and a naive extractor that misses this is the single most common bug in the category. Address runs are handed to the same allow-list module the rest of the site uses, and anything inside one is skipped. Email addresses are treated the same way, so hi#dev@example.com yields nothing. The highlight preview marks those stretches with a dotted underline and says why, rather than leaving you to guess.

Why was #2024 skipped but #Top10 kept?

A tag body made only of digits and underscores is not treated as a hashtag on the major platforms, so #2024, #100 and #___ are rejected. Digits alongside a letter are fine, which is why #Top10 and #2024Recap are kept. Rejections are not silent: each one appears in a short skipped list with its reason, so you can see the difference rather than wonder whether the tool missed something.

Do non-Latin hashtags work?

Yes. The grammar is built from Unicode property escapes rather than an A–Z character class, so #日本, #новости, #مرحبا and #हिंदी are read correctly, with combining marks kept attached to their base letter. The fullwidth # that is common in Japanese, Chinese and Korean posts is recognised as a marker, and the tag is copied back out with the exact marker you typed. Two other lookalikes, ♯ and ⌗, sit behind an off-by-default toggle because a sharp sign in a sentence about music is not a tag.

How are repeated tags counted, and which spelling is shown?

#Coffee, #coffee and #COFFEE are one group with a count of three. The key used for matching is normalised to NFC and lower-cased with a locale pinned to en-US, so the result cannot change between machines — an unpinned fold would group Turkish I and ı differently on a Turkish device. The spelling displayed is always the first one you typed, with the alternates listed underneath. You can turn case-insensitive grouping off if you want each spelling counted separately.

Are the character limits in the budget panel accurate?

They are starting values, recorded on 2026-09-14, not guarantees. Every one of them is an editable number field rather than a constant, and each carries the date it was written down with a note to check it against the platform's current published limit. Platform limits change without notice and were not reachable from the environment this tool was built in. The panel reports only whether your text fits the number you set — it makes no judgement about how many hashtags to use.