使用正则表达式匹配监控词

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

:discourse: 如果您的网站由 Discourse 托管,如果您想启用此设置,请联系 team@discourse.org

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

:information_source: 要在 Watched Words 中使用正则表达式 (regex),您必须先启用 watched words regular expressions 站点设置。

:warning: Regex 功能非常强大,因此也存在风险。编写不正确的 regex 语句可能会给您的用户带来问题。请在非生产环境中测试您的 regex 语句,然后再上线。

示例 Regex 模式

以下是一些常见的 regex 模式及其用法:

区分大小写

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

thread

这将匹配 threadTHREADthReAd

字符替代

使用字符替代来扩展您的匹配项。

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

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

threads?\\S+

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

单词边界

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

\\bthreads?\\b

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

处理 Unicode 字符

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

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

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

假设您想阻止单词 Über,但不想阻止 Übersicht。使用 \\b(ü|ue)ber\\b 这样的单词边界不起作用,因为某些 JavaScript regex 单词标志无法处理 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-ms_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

查找主题标签变体

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

\\#(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/ 上测试 Regex 表达式。如果这样做,请确保将 regex 风格切换到 ECMAScript。

Watched Words 不支持 Regex 捕获和替换,仅支持匹配,因此这在链接或替换操作中无效。

13 个赞

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

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

2 个赞