You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:02:27