使用正则表达式配合关注词

:bookmark: 本主题介绍如何在 Discourse 的被关注词功能中有效地使用正则表达式 (regex)。

:discourse: 对于托管在我们的平台上的站点,这些设置是隐藏的。付费托管方案的客户可以联系我们的支持团队 team@discourse.org,以请求在被关注词中使用正则表达式。
注意: 此功能在我们的免费托管方案中不可用。

正则表达式 (regex) 是定义搜索模式的强大工具。您可以在被关注词功能中使用正则表达式,以提高您 Discourse 站点上单词过滤的准确性和灵活性。

:information_source: 要在被关注词中使用正则表达式 (regex),您必须首先开启 watched words regular expressions 站点设置。

:warning: 正则表达式非常强大,因此也可能很危险。编写不正确的正则表达式语句可能会给您的用户带来问题。请在非生产实例上测试您的正则表达式语句,然后再上线。

示例正则表达式模式

以下是一些常见的正则表达式模式及其使用方法:

区分大小写

默认情况下,Discourse 会匹配单词的大写和小写形式。

thread

这将匹配 threadTHREADthReAd

字符交替

使用字符交替来扩展您的匹配范围。

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

这将匹配上述所有情况,以及 thr3ad7hreadthr34d

threads?\b

这将匹配 threadthreads,但不会匹配 threadedthreading

单词边界

正则表达式模式可能会无意中匹配单词的一部分。使用单词边界可避免部分匹配。

\bthreads?\b

这将匹配 threadthreads,但会避免匹配 threadlikeunthreading 等。

处理 Unicode 字符

标准单词边界在处理 Unicode 字符时可能会失败。为 JavaScript 正则表达式处理不佳的字符创建边界。

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

这将匹配 grüße 的所有常见拼写形式——包括 gruesseGRÜSSE

假设您想屏蔽单词 Über,但不想屏蔽 Übersicht。使用单词边界如 \b(ü|ue)ber\b 不起作用,因为一些 JavaScript 正则表达式的单词标志不处理 Unicode 字符。相反,您必须创建自己的边界。

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

这将适当地匹配 Überueber,但不会匹配 Übersichtuebersicht

捕获故意的字符替换

捕获用户用数字或特殊字符替换字母的单词:

\bp[a@]ssw[o0]rd\b

这将匹配:passwordp@sswordpassw0rdp@ssw0rd,但不会匹配 mypasswordpassword123

处理中间有标点符号的字符

捕获试图通过插入标点符号来规避过滤器的行为:

\bs\W*p\W*a\W*m\b

这将匹配:spams.p.a.ms-p-a-m,但不会匹配 s_p_a_m(下划线是单词字符)、spammymyspam

匹配多个单词变体

用于匹配可能以不同单词形式出现的短语:

\b(contact|email|reach)( us| me)?\b

这将匹配:contactcontact uscontact meemailemail usemail mereachreach usreach me

检测电子邮件模式

捕获通用的电子邮件地址模式:

\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}\b

这将匹配:user@example.commy.name@sub.domain.co.ukuser+tag@domain.org

查找标签 (hashtag) 变体

匹配具有不同大小写或细微差别的标签:

\#(disc[o0]urse|f[o0]rum)\b

这将匹配:#discourse#DISCOURSE#disc0urse#forum#f0rum,但不会匹配 #discourseengine#forums

检测重复模式

捕获可能表明垃圾邮件内容的重复字符:

([a-zA-Z])\1{3,}

这将匹配:aaaamplehellllloyessssss,检测任何字母连续重复 4 次或更多次。

查找带或不带协议的 URL

\b(?:https?:\/\/)?[\w-]+(\.[\w-]+)+\b

这将匹配:example.comsub.domain.orghttps://discourse.orghttp://meta.discourse.org

避免嵌套字符类

正确:

(hold)?

这正确地匹配可选单词 “hold”

或者如果你想要字符交替:

[h][o0][l1][d]

这将匹配:holdh0ldho1dh01d

不正确:

[h[o0][l1]d]?

这会错误地尝试嵌套字符类,并将匹配 ho0l1d 中的任何单个字符,使其匹配 hadold 等单词。

使用括号表示可选单词

正确:

forum(s)?

这正确地匹配:forumforums

不正确:

forum[s]?

这会匹配 “forum” 后跟一个可选的 “s”,但却不必要地使用了字符类。

正确的字符类用法

正确:

bad word

以匹配短语 “bad word”

或者用于字符类的示例:

[bB][aA][dD]

这将匹配:badBadbAdBAD 等。

不正确:

[bad word]

这将匹配 badword 中的任何单个字符,而不是短语 “bad word”。

有效使用量词

\b[0-9]{3,5}\b

这将匹配 3 到 5 位数字:123123412345,但不会匹配 12123456

对于特定的重复模式:

(spam){2,3}

这将匹配:spamspamspamspamspam

正确应用单词边界

无边界:

free

这将匹配:freefreedomcarefree

带边界:

\bfree\b

这将只匹配:free,但不匹配 freedomcarefree

正确处理 Unicode 字符

正确方法:

(?:^|\s)(ö|oe)zel\b

这将以单词边界匹配:özeloezel,即使存在 Unicode 字符。

不正确方法:

\bözel\b

这可能无法正确处理土耳其字符 ö。

附加信息

:information_source: 您可以在 https://regex101.com/ 上测试正则表达式表达式。如果进行测试,请确保将正则表达式的风格切换为 ECMAScript。

被关注词的替换值不支持正则表达式捕获组反向引用(例如替换字符串中的 \1)。替换和链接操作支持正则表达式进行匹配,但替换始终是字面字符串。

13 个赞

原谅我的菜鸟,但我在任何地方都找不到“监视词正则表达式”的站点设置。我也查找了“regex”、“regular expression”和其他变体,但没有找到任何看起来可以为监视词启用正则表达式的东西。您是否有启用此功能的站点设置的 slug(云托管实例)?

编辑 答案就在上面,并且可以在此处找到

2 个赞