Using Regex with Watched Words

Regex Expressions

Discourse allows the use of regular expressions (regex) in Watched Words.

:information_source: To use regular expressions (regex) in watched words you must first turn on the watched words regular expressions site setting.

:discourse: If your site is hosted with Discourse, please reach out to team@discourse.org if you would like to enable this setting.

:warning: Regex is extremely powerful and thus dangerous. An incorrectly written regex statement can cause issues for your users. Test your regex statements on non-production instances before going live.

Discourse by default matches all uppercase and lowercase forms of a word entered as a regular expression. That is,

thread

This will match thread, THREAD, and thReAd.

We could also use a regex expression here:

(t|7)hr(3|e)(4|a)d

This will match all of the cases above, plus thr3ad, 7hread, and thr34d.

threads?\S+

This will match thread and threads but not threaded or threading.

However, :stop_sign: there’s a glaring error in ALL the above examples! The words threadlike and unthreading are matched (un▪️▪️▪️▪️▪️ing), even though they’re not referring to thread. How do we fix that?

We’d have to amend our regex to handle word boundaries.

\bthreads?\b

This looks for boundaries around the word so that unthreading or threadlike aren’t caught by the filter, but thread and threads still are.

For handling Unicode characters

gr(ü|ue)(ß|ss)e

This matches all commonly spelled forms of the word grüße — including gruesse and GRÜSSE

Say we want to block the word Über, but not Übersicht. Using word boundaries like \b(ü|ue)ber\b doesn’t work because some of the JavaScript regex word flags don’t handle Unicode characters.

Instead we have to make our own boundaries.

(?:^|\s)(ü|ue)ber\b

This will now appropriately match Über and ueber, but not Übersicht or uebersicht.

:information_source: You can also test Regex expressions on https://regex101.com/. If you do so, ensure you switch the regex flavour to ECMAScript.

Regex capture and replace is not supported in Watched Words, only matching, so this will not work on the link or replace actions.

3 Likes