繁体   English   中英

正则表达式中的特殊字符问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM