簡體   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