含重复分隔符的字符串解析:寻求更优实现方案
更优解析方案:正则表达式匹配
嘿,这个场景用正则表达式来处理绝对是更优解!完全不用写一堆绕来绕去的Substring逻辑,几行代码就能精准搞定你的需求。
你的核心需求其实是:从每个$分隔的片段里,提取冒号分隔的最后一段内容,同时把Seasonal / Holiday里的空格斜杠改成Seasonal/Holiday。正则刚好能完美适配这个匹配逻辑。
核心思路
用这个正则表达式直接匹配所有符合要求的内容:(?<=:)[^:$]+(?!.*:)
简单解释下规则:
(?<=:):正向预查,确保当前匹配内容的前面是冒号[^:$]+:匹配任意不是冒号和$的字符,也就是每个片段的最后一段内容(?!.*:):负向预查,确保当前匹配内容后面没有冒号,保证是该片段的最后一部分
代码示例(C#版本)
string input = "$Categories:BY COLOR:Spice$Categories:CATEGORIES:Botanical$Categories:CATEGORIES:Botanical:Leaves$Sources:adl-bdc2012:vol1:PUBLISHED-NON-150:KOETSIER,ALBERT$Categories:CATEGORIES:Seasonal / Holiday"; // 定义正则规则 Regex regex = new Regex(@"(?<=:)[^:$]+(?!.*:)"); // 获取所有匹配结果 MatchCollection matches = regex.Matches(input); // 处理格式并拼接成目标字符串 string result = string.Join(", ", matches.Cast<Match>().Select(m => m.Value.Replace(" / ", "/"))); // 输出结果:Spice, Botanical, Leaves, KOETSIER, ALBERT, Seasonal/Holiday Console.WriteLine(result);
代码示例(JavaScript版本)
const input = "$Categories:BY COLOR:Spice$Categories:CATEGORIES:Botanical$Categories:CATEGORIES:Botanical:Leaves$Sources:adl-bdc2012:vol1:PUBLISHED-NON-150:KOETSIER,ALBERT$Categories:CATEGORIES:Seasonal / Holiday"; // 全局匹配所有符合规则的内容 const matches = input.match(/(?<=:)[^:$]+(?!.*:)/g); // 处理格式并拼接 const result = matches.map(item => item.replace(" / ", "/")).join(", "); console.log(result); // 输出目标字符串
为什么这个方案更优?
- 简洁高效:不用手动分割字符串、判断层级,正则一次性完成所有匹配
- 易维护:如果后续规则有小调整(比如分隔符变化),只需修改正则表达式即可
- 通用性强:大部分编程语言都支持正则表达式,换语言也能快速适配
内容的提问来源于stack exchange,提问作者user5120455
相关产品推荐
相关产品推荐

