当前位置: 首页 > 知识库问答 >
问题:

是否从字符串正则表达式或LINQ中删除单词列表?[关闭]

高钱青
2023-03-14

我想删除字符串中的单词列表

static string[] BAD_WORDS = {
            "hdtv", "exm", "RMT", "DD5", "YTS", "TURKISH", "VIDEOFLIX", "Gisaengchung", "KOREAN", "8CH",
            "BluRay", "Hdcam", "-", "XviD", "AC3", "EVO", "WEBRip", "FGT", "MP3", "CMRG", "Pahe", "webdl",
            "10bit", "720p", "1080p", "480p", "WEB-DL", "H264", "H265", "x264", "x265", "800MB", "900MB",
            "HEVC", "PSA", "RARBG", "6CH", "2CH", "CAMRip", "Rip", "AVS", "RMX", "RMTeam", "mSD", ".",
            "SVA", "MkvCage", "MeGusta", "TBS", "AMZN", "DDP5.1", "DDP5", "SHITBOX", "NITRO", "WEB", "DL",
            "1080", "720", "480", "MrMovie", "BWBP", "NTG", "HMAX", "Atmos", "MZABI", "2018", "2019", "2020",
            "2021", "2022", "MRCS", "/", "GalaxyRG", "HDR", "YTS.LT", "1400MB", "H.264", "H.265", "YTS.MX",
            "DV", "PSiG", "ION10", "NTb", "SYNCOPY", "PHOENIX", "MinX", "300MB", "150MB", "AFG", "Cakes",
            "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "@Gemovies", "M3", "DD5.1"
        };

我使用了两种方法来实现这一点,一种是linq,另一种是regex

public static string RemoveBadWords(string stringToClean)
        {
            //var cleaned = string.Join(" ", stringToClean.Split(new string[] { " ", ".", "-" }, StringSplitOptions.None).Where(w => !BAD_WORDS.Contains(w, StringComparer.OrdinalIgnoreCase)));

            var cleaned = Regex.Replace(stringToClean, "\\b" + string.Join("\\b|\\b", BAD_WORDS) + "\\b", " ", RegexOptions.IgnoreCase);

            return cleaned.Trim();
        }

现在看来,regex的性能更好了,例如,这段代码的输出是:

Console.WriteLine(RemoveBadWords("Mortal.Kombat.2021.1080p.WEB-DL.DD5.1.H.264.EVO.M3"));

LINQ:Mortal Kombat 1 H 264

正则表达式:Mortal Kombat 264

现在的问题是为什么在regex方法中没有移除H.264?(仅去除H.)

在性能速度方面,哪种方法更好?

regex中使用的方法是否正确?能不能改进一下,少犯点错?

共有1个答案

寿亦
2023-03-14

你的部分问题是你的一些单词是其他单词的子字符串。因此,当您尝试替换较长的变体时,它们将不再存在,因为它们的一部分已经被删除了。解决方法是以反向排序的顺序处理字符串。您遇到的另一个问题是,您试图在“.”上拆分,而这已经包含在您的一些坏话中。

有多种不同的方法可以做到这一点。正则表达式通常不是答案,但它在这里起作用(尽管它的性能可能不是那么好,如果这很重要的话)。我们首先按降序排列不良单词,然后使用aggregate迭代替换每个不良单词。我们需要使用regex.escape来确保嵌入的“。字符不被解释为特殊字符。最后,我们执行最后一次传递,删除任何剩余的句点和空格。您还必须删除“.”从你原来的坏字列表中输入。

var words = BAD_WORDS.OrderByDescending(c => c);
var result = words.Aggregate(stringToClean, (p,c) => Regex.Replace(p, "\\b" + Regex.Escape(c) + "\\b", "", RegexOptions.IgnoreCase));

result = Regex.Replace(result, "[\\.\\s]+", " ").Trim();

我不建议在生产场景中使用这段代码,但很明显,您正在清理torrent电影文件,我相信您真的不会在意。

为了好玩,这里有一个使用当前单词列表的主要基于正则表达式的解决方案:

var pattern = @"\b(?:hd(?:tv|cam|r)|e(?:xm|vo)|RMT|DDP?5(?:\.1)?|YTS|Turkish|VideoFlix|Gisaengchung|Korean|8CH|BluRay|-|XVid|A(?:c3|VS)|web(?:-?(?:rip|dl))?|fgt|mp3|cmrg|pahe|10bit|(?:720|480|1080)[pi]?|H\.?26[45]|x26[45]|\d{3,}MB|H(?:MAX|EVC)|PS(?:A|iG)|RARBG|[26]CH|(?:CAM)?Rip|RM(?:X|Team)|msd|sva|mkvcage|megusta|tbs|amz|shitbox|nitro|Mr(?:Movie|CS)|BWBP|NT[bG]|Atmos|MZABI|20(?:1\d|2[01])|\/|GalaxyRG|YTS(?:\.(?:LT|MX))?|DV|ION10|SYNCOPY|Phoenix|Minx|AFG|Cakes|@Gemovies|M3)\b";

var inner = new Regex(pattern, RegexOptions.IgnoreCase|RegexOptions.Compiled);
var outer = new Regex(@"[\.\s]+", RegexOptions.Compiled);
var result = outer.Replace(inner.Replace(stringToClean, ""), " ").Trim();
 类似资料:
  • 问题内容: 我有一个停用词列表。我有一个搜索字符串。我想从字符串中删除单词。 举个例子: 现在,代码应删除“ What”和“ is”。但是在我的情况下,它会去除“ a”和“ at”。我在下面给出了我的代码。我可能做错了什么? 如果输入查询为“什么是Hello”,则输出为: 为什么会这样? 问题答案: 这是一种方法: 我注意到,如果列表中包含小写字母,您还希望删除该单词,因此我在条件检查中添加了对的

  • 我试图从包含非alpha字符的字符串列表中删除单词,例如: 但我不能随意删除包含非alpha字符的单词,因为可能出现以下情况: 我需要想出一个正则表达式或类似的方法来处理这样的简单情况(所有类型的标点符号): 我使用一个自然语言包装类将句子转换为左侧的列表,但有时列表要复杂得多: 正如您所看到的,一些字符(如括号和撇号)被包装器转换或删除。我想将所有这些无关的子字符串处理成一个更干净的外观: 我对

  • 问题内容: 如何在Java中从给定的字符串中删除所有方括号(“ []”)? 在这种情况下将使用什么正则表达式? 问题答案: 使用这个:

  • 我在一个多语言网站上工作,并已选择使用每种语言的自定义URL,例如: 两者都指向城市控制员的指数方法。 在每个页面上都有一个切换语言的选项,它会在我的路由中查找以匹配控制器、视图和语言。 因此,如果我在荷兰语页面上,它会找到英文版的正确网址,即“城市”而不是“steden”。 在我开始使用更复杂的正则表达式之前,一切都很好。 我有这些正则表达式,它们将匹配我所需的URL: 在我的代码中,我可以访问

  • 我们需要使用C#中的Regex. Replace()从电话号码中删除字符。允许的字符是(仅第一个字符)和[0-9]。应该过滤其他任何内容。 替换所有非数字的内容很好,但是我们怎么能只允许on作为第一个字符呢? 我们的正则表达式: 在这个数字上:它会删除空格和连字符,但不会删除23前面的。 知道如何解决这个问题吗?

  • 我不熟悉Javascript和正则表达式,所以我一直在研究如何使路由匹配所有以