如何在C#中从超长字符串提取X、Y坐标值及Delay值到对应数组
在C#中提取X/Y坐标和Delay值的方法
嘿,我来帮你搞定这个需求!从你提供的这段类XML格式的字符串里提取X/Y坐标数组和单独的Delay数组,有两种实用的方法,我给你一步步说明:
方法一:使用XML解析(推荐,更可靠)
你的字符串本质是XML片段,只是缺少根节点,我们可以先给它套一个根节点,然后用C#的XDocument来解析,这种方法对XML结构的兼容性更好,不容易出错。
代码示例:
using System; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; class Program { static void Main() { // 你的超长字符串(这里用示例片段代替) string rawXml = @"<Type>3</Type> <X>1018</X> <Y>800</Y> <Delay>22</Delay> </MouseMovementEvent> <MouseMovementEvent> <Type>3</Type> <X>1014</X> <Y>805</Y> <Delay>22</Delay> </MouseMovementEvent> <MouseMovementEvent> <Type>3</Type> <X>1010</X> <Y>810</Y> <Delay>62</Delay> </MouseMovementEvent> </MouseMovement> </MacroEvent> <MacroEvent> <Type>2</Type> <MouseEvent> <MouseButton>1</MouseButton> <State>1</State> </MouseEvent> </MacroEvent> <MacroEvent> <Type>2</Type> <MouseEvent>"; // 给片段添加根节点,让它成为合法XML string validXml = $"<Root>{rawXml}</Root>"; // 加载XML文档 XDocument doc = XDocument.Parse(validXml); // 提取所有MouseMovementEvent元素 var movementEvents = doc.Descendants("MouseMovementEvent"); // 存储X/Y坐标的列表 List<int[]> coordinateList = new List<int[]>(); // 存储Delay的列表 List<int> delayList = new List<int>(); foreach (var evt in movementEvents) { // 提取X、Y、Delay的值并转换为int if (int.TryParse(evt.Element("X")?.Value, out int x) && int.TryParse(evt.Element("Y")?.Value, out int y) && int.TryParse(evt.Element("Delay")?.Value, out int delay)) { coordinateList.Add(new int[] { x, y }); delayList.Add(delay); } } // 转成数组(如果需要的话) int[][] coordinates = coordinateList.ToArray(); int[] delays = delayList.ToArray(); // 测试输出 foreach (var coord in coordinates) { Console.WriteLine($"[X: {coord[0]}, Y: {coord[1]}]"); } foreach (var d in delays) { Console.WriteLine($"Delay: {d}"); } } }
方法二:使用正则表达式(适合结构固定的场景)
如果你的字符串结构非常固定,不会有格式变化,也可以用正则表达式来匹配提取,代码更简洁,但对格式变动的容错性差一些。
代码示例:
using System; using System.Collections.Generic; using System.Text.RegularExpressions; class Program { static void Main() { string rawString = @"<Type>3</Type> <X>1018</X> <Y>800</Y> <Delay>22</Delay> </MouseMovementEvent> <MouseMovementEvent> <Type>3</Type> <X>1014</X> <Y>805</Y> <Delay>22</Delay> </MouseMovementEvent> <MouseMovementEvent> <Type>3</Type> <X>1010</X> <Y>810</Y> <Delay>62</Delay> </MouseMovementEvent> </MouseMovement> </MacroEvent> <MacroEvent> <Type>2</Type> <MouseEvent> <MouseButton>1</MouseButton> <State>1</State> </MouseEvent> </MacroEvent> <MacroEvent> <Type>2</Type> <MouseEvent>"; // 正则表达式匹配每个MouseMovementEvent里的X、Y、Delay string pattern = @"<MouseMovementEvent>.*?<X>(\d+)</X>.*?<Y>(\d+)</Y>.*?<Delay>(\d+)</Delay>.*?</MouseMovementEvent>"; Regex regex = new Regex(pattern, RegexOptions.Singleline); List<int[]> coordinateList = new List<int[]>(); List<int> delayList = new List<int>(); foreach (Match match in regex.Matches(rawString)) { if (int.TryParse(match.Groups[1].Value, out int x) && int.TryParse(match.Groups[2].Value, out int y) && int.TryParse(match.Groups[3].Value, out int delay)) { coordinateList.Add(new int[] { x, y }); delayList.Add(delay); } } // 转成数组 int[][] coordinates = coordinateList.ToArray(); int[] delays = delayList.ToArray(); // 测试输出 foreach (var coord in coordinates) { Console.WriteLine($"[X: {coord[0]}, Y: {coord[1]}]"); } foreach (var d in delays) { Console.WriteLine($"Delay: {d}"); } } }
注意事项
- 两种方法都用到了
int.TryParse来避免转换失败的异常,如果你确定所有值都是合法整数,也可以直接用int.Parse。 - XML解析方法更推荐,因为如果XML结构有小的变动(比如元素顺序变化),它依然能正常工作;正则表达式则依赖于固定的文本结构。
内容的提问来源于stack exchange,提问作者zjebinsky
相关产品推荐
相关产品推荐

