如何忽略输入数组中的正则元字符,实现字符串精确匹配分割?
解决正则分隔符中元字符的转义问题
你的核心需求是让分隔符里的正则元字符(比如.、|)被当作普通字符串处理,同时保留手动添加的|作为“或”逻辑,直接用Regex.Escape()就能搞定这个问题。
修改后的代码
先对每个分隔符做转义处理,再用|拼接成正则表达式:
List<string> RxltOut = new List<string>(); string[] WordsList = { "ab.c.d", "a.b.cd", "a|b.cd.x|z"}; string[] RgxSplits = { "cd", "ab", "a|b", "a.b" }; // 包含元字符的分隔符 // 转义每个分隔符后再用|连接,保留"或"逻辑 string RgxSplit2BU = string.Join("|", RgxSplits.Select(s => Regex.Escape(s))); foreach (var _word in WordsList) { RxltOut.AddRange(Regex.Split(_word, RgxSplit2BU, RegexOptions.IgnoreCase)); } foreach (var x in RxltOut) { Console.WriteLine(x); }
原理说明
Regex.Escape()会自动把字符串里的所有正则元字符(比如.匹配任意字符、|表示分支)转义成字面量,比如a|b会被转成a\|b,a.b会被转成a\.b,这样正则引擎就会把它们当作普通字符串匹配,不会解析成正则语法。- 转义后用
|连接,就实现了“匹配任意一个分隔符字面量”的逻辑,完全符合你的需求。
备选策略
如果不想用正则分割,也可以用字符串替换+分割的方式实现:
- 选一个原字符串中绝对不会出现的标记(比如
###SPLIT###)。 - 遍历所有分隔符,把原字符串中匹配到的分隔符(忽略大小写)替换成这个标记。
- 最后用标记分割字符串。
示例代码:
List<string> RxltOut = new List<string>(); string[] WordsList = { "ab.c.d", "a.b.cd", "a|b.cd.x|z"}; string[] RgxSplits = { "cd", "ab", "a|b", "a.b" }; string splitMarker = "###SPLIT###"; foreach (var _word in WordsList) { string temp = _word; foreach (var split in RgxSplits) { // 忽略大小写的字面量替换 temp = Regex.Replace(temp, Regex.Escape(split), splitMarker, RegexOptions.IgnoreCase); } RxltOut.AddRange(temp.Split(new[] { splitMarker }, StringSplitOptions.None)); } foreach (var x in RxltOut) { Console.WriteLine(x); }
这个方法逻辑更直观,但如果分隔符数量较多,效率会不如直接用正则分割。
内容的提问来源于stack exchange,提问作者Faraz Ahmed Qureshi
相关产品推荐
相关产品推荐

