[英]Special character issue in regular expression
我正在尝试根据被禁单词列表创建一个正则表达式。 它将与字符串进行比较以查找被禁止的单词。 找不到子词。
禁止的单词也将被修改为包括其他可以替换字母的字符,例如“ @”或“!”。 在伟哥; “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
。
我意识到这很不好,因为它在特殊字符上使用了字边界-但是我不确定如果没有它,如何为所有普通字符完成我想要的工作。
为了解决此问题,我可以做一些事情组合吗? 我已经尽力了。
基本上,我试图基于单词列表创建审核工具,并即时生成正则表达式。 现在,我只需要它也可以用于特殊字符。
问题是,特殊字符和子短语的数量几乎是无限的。 多字符表示法也是有问题的。
例如:|-| acking或/ iagra
(因为字符串长度不匹配,所以非常困难)
同样,不应该找到任何子词的要求也意味着您也不会阻止有趣的新短语。 例如,称某人为“猪猪”将是每一次进攻,但不会被您的算法所接受。
您需要的正则表达式的种类或复杂性将大大增加。 您可能需要考虑一种原始的(或不是那么原始的)令牌化/规范化方法。 否则,您将没有机会抓住“ f * * k”之类的东西。
这种类型的问题比科学更多,是艺术,虽然您可以帮助管理员,但我不确定您是否可以100%自动完成所有工作。 确保在项目中为报表系统留出空间。 他们很难摆脱。
Is there a combination of things somehow that I can do in order to fix this issue?
是的..
点网可以表达是/否条件。 使用该信息,您可以
仍然以相同的方式构造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)";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.