如何在C#中结合正则表达式实现数组元素的完全匹配过滤?
解决完全匹配删除黑名单项的问题
你的问题核心是把包含匹配改成完全匹配,下面给你几种实用的解决办法:
方法一:直接用完全相等判断(最简洁高效)
不用循环,直接通过LINQ判断当前行是否在黑名单里,这就是严格的完全匹配:
string[] black_list = { "Music", "Voice", "Animal" }; arr = arr.Where(line => !black_list.Contains(line)).ToArray();
如果需要忽略大小写(比如匹配"music"也删除),可以改成:
arr = arr.Where(line => !black_list.Any(item => item.Equals(line, StringComparison.OrdinalIgnoreCase))).ToArray();
方法二:用正则实现完全匹配
如果你一定要用正则的^$来实现行首行尾的完全匹配,记得要对黑名单里的内容做转义(防止特殊字符干扰正则),代码如下:
using System.Text.RegularExpressions; string[] black_list = { "Music", "Voice", "Animal" }; arr = arr.Where(line => !black_list.Any(item => Regex.IsMatch(line, $"^{Regex.Escape(item)}$") )).ToArray();
同样,要忽略大小写的话,给Regex.IsMatch加个参数:
Regex.IsMatch(line, $"^{Regex.Escape(item)}$", RegexOptions.IgnoreCase)
为什么原来的代码不行?
你之前用line.Contains(black_list[i])是判断字符串中是否包含子串,所以"Music video"里有"Music"子串就会被删掉;改成完全相等或者正则的^$匹配,就只会删掉和黑名单里内容完全一致的项。
内容的提问来源于stack exchange,提问作者K14M
相关产品推荐
相关产品推荐

