C#中处理跨多行字符串:合并数字值间文本到行尾
解决字符串跨多行的块截断问题
我来帮你搞定这个字符串处理的需求!首先咱们先明确下核心目标:
输入是一段可能跨多行的字符串,结构是多个
数字|IP|文本的块连在一起,需要去掉最后一个块,把前面的所有块内容拼接起来作为输出。
比如你给的示例:
- 输入:
567899|190.78.9|xmp xmyz lpz dwx 765423|195.9.0|nnox wertx wz 89021|199.6.7|xxz - 期望输出:
567899|190.78.9|xmp xmyz lpz dwx 765423|195.9.0|nnox wertx wz
你之前的代码只处理数字开头的行,丢了中间的文本,问题出在按行分割处理——因为文本可能和数字在同一行,甚至跨多行,所以必须把整个输入当成一个完整的字符串来处理。
解决方案(C#)
这里提供两种实用的实现方式:
方法1:正则捕获所有有效块
通过正则表达式匹配所有完整的数字|IP|文本块(直到下一个数字块开始),然后拼接这些块:
using System; using System.IO; using System.Text.RegularExpressions; class Program { static void Main() { // 读取整个文件内容,合并多行成一个字符串(去掉换行符) string input = File.ReadAllText("your_input_file.txt").Replace(Environment.NewLine, ""); // 正则匹配:每个块以数字+|开头,直到下一个数字+|出现 var blockMatches = Regex.Matches(input, @"(\d+\|.*?)(?=\d+\|)"); string result = string.Empty; foreach (Match match in blockMatches) { result += match.Value; } // 去掉末尾可能的多余空格 result = result.Trim(); Console.WriteLine(result); // 也可以写入文件:File.WriteAllText("output.txt", result); } }
方法2:定位最后一个块的起始位置
从右往左找到最后一个数字|的位置,直接截断到该位置之前:
using System; using System.IO; using System.Text.RegularExpressions; class Program { static void Main() { string input = File.ReadAllText("your_input_file.txt").Replace(Environment.NewLine, ""); // 从右往左匹配第一个(也就是最后一个)数字+|(前面带空格,对应示例中的分隔) var lastBlockStart = Regex.Match(input, @"(?<=\s)\d+\|", RegexOptions.RightToLeft); if (lastBlockStart.Success) { string result = input.Substring(0, lastBlockStart.Index).Trim(); Console.WriteLine(result); } else { // 如果没有找到多个块,直接返回原内容 Console.WriteLine(input.Trim()); } } }
关键说明
- 为什么不按行处理?因为你的文本部分可能和数字在同一行,或者跨多行分布,按行分割会破坏块的完整性。
File.ReadAllText会一次性读取整个文件内容,避免了逐行处理的局限性。- 正则表达式中的
(?=\d+\|)是正向预查,确保我们只匹配到下一个块开始前的内容,不会包含后面的数字块。
内容的提问来源于stack exchange,提问作者adsf
相关产品推荐
相关产品推荐

