本主题介绍如何在 Discourse 的 Watched Words 功能中有效使用正则表达式 (regex)。
如果您的网站由 Discourse 托管,如果您想启用此设置,请联系 team@discourse.org。
正则表达式 (regex) 是定义搜索模式的强大工具。您可以在 Watched Words 功能中使用 regex,以提高 Discourse 网站上单词过滤的准确性和灵活性。
要在 Watched Words 中使用正则表达式 (regex),您必须先启用
watched words regular expressions站点设置。
Regex 功能非常强大,因此也存在风险。编写不正确的 regex 语句可能会给您的用户带来问题。请在非生产环境中测试您的 regex 语句,然后再上线。
示例 Regex 模式
以下是一些常见的 regex 模式及其用法:
区分大小写
默认情况下,Discourse 会匹配单词的大小写形式。
thread
这将匹配 thread、THREAD 和 thReAd。
字符替代
使用字符替代来扩展您的匹配项。
(t|7)hr(3|e)(4|a)d
这将匹配上述所有情况,以及 thr3ad、7hread 和 thr34d。
threads?\\S+
这将匹配 thread 和 threads,但不会匹配 threaded 或 threading。
单词边界
Regex 模式可能会无意中匹配单词的一部分。使用单词边界可避免部分匹配。
\\bthreads?\\b
这将匹配 thread 和 threads,但会避免匹配 threadlike 或 unthreading。
处理 Unicode 字符
标准的单词边界在处理 Unicode 字符时可能会失败。为 JavaScript regex 处理不佳的字符创建边界。
gr(ü|ue)(ß|ss)e
这将匹配 grüße 这个单词的所有常见拼写形式,包括 gruesse 和 GRÜSSE。
假设您想阻止单词 Über,但不想阻止 Übersicht。使用 \\b(ü|ue)ber\\b 这样的单词边界不起作用,因为某些 JavaScript regex 单词标志无法处理 Unicode 字符。您必须自己创建边界。
(?:^|\\s)(ü|ue)ber\\b
这现在将正确匹配 Über 和 ueber,但不会匹配 Übersicht 或 uebersicht。
捕获故意替换的字符
捕获用户用数字或特殊字符替换字母的单词:
\\bp[a@]ssw[o0]rd\\b
这将匹配:password、p@ssword、passw0rd、p@ssw0rd,但不会匹配 mypassword 或 password123。
处理中间带有标点符号的字符
捕获通过插入标点符号来规避过滤器的尝试:
\\bs\\W*p\\W*a\\W*m\\b
这将匹配:spam、s.p.a.m、s-p-a-m、s_p_a_m,但不会匹配 spammy 或 myspam。
匹配多个单词变体
匹配可能出现不同单词形式的短语:
\\b(contact|email|reach)( us| me)?\\b
这将匹配:contact、contact us、contact me、email、email us、email me、reach、reach us、reach me。
检测电子邮件模式
捕获通用的电子邮件地址模式:
\\b[\\w.%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}\\b
这将匹配:user@example.com、my.name@sub.domain.co.uk、user+tag@domain.org。
查找主题标签变体
匹配具有不同大小写或细微差别的 #主题标签:
\\#(disc[o0]urse|f[o0]rum)\\b
这将匹配:#discourse、#DISCOURSE、#disc0urse、#forum、#f0rum,但不会匹配 #discourseengine 或 #forums。
检测重复模式
捕获可能表明垃圾内容的重复字符:
([a-zA-Z])\\1{3,}
这将匹配:aaaample、helllllo、yessssss,检测任何连续重复 4 次或更多次的字母。
查找带或不带协议的 URL
\\b(?:https?:\\/\\/)?[\\w-]+(\\.[\\w-]+)+\\b
这将匹配:example.com、sub.domain.org、https://discourse.org、http://meta.discourse.org。
避免嵌套字符类
正确:
(hold)?
这将正确匹配可选单词 “hold”。
或者如果您想要字符替代:
[h][o0][l1][d]
这将匹配:hold、h0ld、ho1d、h01d。
错误:
[h[o0][l1]d]?
这将错误地尝试嵌套字符类,并将匹配 h、o、0、l、1 或 d 中的任何单个字符,使其匹配 had、old 等单词。
使用括号匹配可选单词
正确:
forum(s)?
这将正确匹配:forum、forums。
错误:
forum[s]?
这将匹配 “forum” 后面的可选 “s”,但却不必要地使用了字符类。
正确使用字符类
正确:
bad word
匹配短语 “bad word”。
或者作为字符类示例:
[bB][aA][dD]
这将匹配:bad、Bad、bAd、BAD 等。
错误:
[bad word]
这将匹配 b、a、d、w、o、r 或 d 中的任何单个字符,而不是短语 “bad word”。
有效使用量词
\\b[0-9]{3,5}\\b
这将匹配 3 到 5 位数字:123、1234、12345,但不匹配 12 或 123456。
对于特定的重复模式:
(spam){2,3}
这将匹配:spamspam、spamspamspam。
正确应用单词边界
无边界:
free
这将匹配:free、freedom、carefree。
有边界:
\\bfree\\b
这将仅匹配:free,但不匹配 freedom 或 carefree。
正确处理 Unicode 字符
正确方法:
(?:^|\\s)(ö|oe)zel\\b
这将在单词边界处匹配:özel、oezel,即使有 Unicode 字符。
错误方法:
\\bözel\\b
这可能无法正确处理土耳其语字符 ö。
附加信息
您可以在 https://regex101.com/ 上测试 Regex 表达式。如果这样做,请确保将 regex 风格切换到 ECMAScript。
Watched Words 不支持 Regex 捕获和替换,仅支持匹配,因此这在链接或替换操作中无效。