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