C#中如何分割含#开头标识的字符串并保留对应标识内容
C# 按#标签拆分字符串并保留标签的实现方案
问题说明
输入字符串固定由两段内容拼接而成,每段对应一个#开头的标签词,示例输入输出规则如下:
- 输入:
one two three #abc four five six #xyz - 预期输出:
- 第一段:
one two three #abc - 第二段:
four five six #xyz
- 第一段:
- 原有错误代码输出:
- data1:
one two three(丢失对应#abc标签) - data2:
four five six(丢失对应#xyz标签)
- data1:
原有代码的问题:
Substring(0,input.IndexOf('#'))只截取到第一个#符号的前一位,直接把#abc标签排除在了截取范围外Regex.Split(input, @"(?<!\w)#\w+")会将正则匹配到的#标签作为分隔符直接丢弃,因此拆分结果不会包含标签内容
正确实现代码
方案1:纯字符串查找(性能最优,推荐)
无需依赖正则,直接定位第二个#标签的位置完成拆分即可:
string input = "one two three #abc four five six #xyz"; string data1 = string.Empty; string data2 = string.Empty; // 先定位第一个#的位置,再从该位置往后查找第二个#的位置作为拆分点 int firstTagPos = input.IndexOf('#'); int splitPos = input.IndexOf('#', firstTagPos + 1); if (splitPos > -1) { // 截取到拆分位置前,去除末尾多余空格 data1 = input.Substring(0, splitPos).TrimEnd(); // 从拆分位置截取到字符串末尾即为第二段 data2 = input.Substring(splitPos); } Console.WriteLine("output1 - " + data1); Console.WriteLine("output2 - " + data2);
方案2:正则匹配定位
如果需要兼容标签前后存在特殊字符的场景,可以通过正则匹配所有#标签的位置再做拆分:
using System.Text.RegularExpressions; string input = "one two three #abc four five six #xyz"; string data1 = string.Empty; string data2 = string.Empty; MatchCollection tags = Regex.Matches(input, @"#\w+"); if (tags.Count >= 2) { int splitPos = tags[1].Index; data1 = input.Substring(0, splitPos).TrimEnd(); data2 = input.Substring(splitPos); } Console.WriteLine("output1 - " + data1); Console.WriteLine("output2 - " + data2);
两种方案运行后均输出符合预期的结果:
output1 - one two three #abc output2 - four five six #xyz
内容的提问来源于stack exchange,提问作者krishna mohan
相关产品推荐
相关产品推荐

