我试图根据禁止词列表创建正则表达式。这将与字符串进行比较以查找被禁止的单词。不应该找到任何子词。
被禁止的单词也将被修改为包含其他可替代的字符,以代替#34; @"或"!"在伟哥; "!V□的GRA"
所以我有一个字符串,我搜索一个字。然后我使用单词边界编写正则表达式以包含所有可能的其他字符。
这一直有效,直到我遇到需要找到特殊字符的情况。我用字边界意识到它不会以同样的方式找到常规字符 - 但我不确定是否有一个好的选择。
伪代码:
string ReviewText = "$uck";
string BannedWord = "suck";
string regexInput = "";
if (BannedWord .Contains("s") || BannedWord .Contains("S"))
{
BannedWord = BannedWord .Replace("s", "[$s25]");
BannedWord = BannedWord .Replace("S", "[$s25]");
}
regexInput = @"\b" + bannedWord + @"\b";
那应该创建\b[$s25]uck\b
。
我意识到这很糟糕,因为它在特殊字符上使用了字边界 - 但是我不知道如何在没有它的情况下完成我想要的所有普通字符。
为了解决这个问题,我能以某种方式组合吗?我已经尝试过所有我能想到的。
基本上我尝试基于单词列表创建审核工具,并动态生成正则表达式。现在我只需要在特殊字符的情况下工作。
答案 0 :(得分:0)
问题是,特殊字符和子短语的数量几乎是无限的。多字符表示也存在问题。
例如:| - | acking或/ iagra
(因为弦乐长度不匹配,所以非常困难)
此外,要求不应找到子词,这意味着您也不会阻止有趣的新词组。例如,称某人为" pigf ** ker"将是每一个令人反感的,但不是你的算法。
您需要的正则表达系列的家庭或复杂性将会大幅增长。您可能想要考虑原始(或不那么原始)标记化/规范化方法。否则,你就没有机会捕捉像" f * * k"。
这类问题更多的是艺术而不是科学问题,虽然您可以帮助管理员,但我不确定您是否能够100%自动完成。务必在项目中为报告系统留出空间。他们很难逃脱。
答案 1 :(得分:0)
Is there a combination of things somehow that I can do in order to fix this issue?
是..
Dot-Net可以表达是/否条件。使用该信息,你可以
仍然以相同的方式构建您的regexInput
字符串,只需将\b
替换为
适当的条件。
通过这种方式,您可以将Bannedword中的任何字符替换为任何其他字符 没有担心边界条件。
示例正则表达式字符串结果:
# (?(?=\w)\b|\B)[$s25]uck(?(?<=\w)\b|\B)
(?(?= \w ) # Conditional, is next letter a word
\b # yes, word boundry
| \B # no, not word boundry
)
[$s25] uck
(?(?<= \w ) # Conditional, was prev letter a word
\b # yes, word boundry
| \B # no, not word boundry
)
只需将您的伪代码更改为:
string ReviewText = "$uck";
string BannedWord = "suck";
string regexInput = "";
if (BannedWord .Contains("s") || BannedWord .Contains("S"))
{
BannedWord = BannedWord .Replace("s", "[$s25]");
BannedWord = BannedWord .Replace("S", "[$s25]");
}
regexInput = @"(?(?=\w)\b|\B)" + bannedWord + @"(?(?<=\w)\b|\B)";