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

时间:2014-11-18 20:31:20

标签: c# regex pattern-matching special-characters

我试图根据禁止词列表创建正则表达式。这将与字符串进行比较以查找被禁止的单词。不应该找到任何子词。

被禁止的单词也将被修改为包含其他可替代的字符,以代替#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

我意识到这很糟糕,因为它在特殊字符上使用了字边界 - 但是我不知道如何在没有它的情况下完成我想要的所有普通字符。

为了解决这个问题,我能以某种方式组合吗?我已经尝试过所有我能想到的。

基本上我尝试基于单词列表创建审核工具,并动态生成正则表达式。现在我只需要在特殊字符的情况下工作。

2 个答案:

答案 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)";