C# c正则表达式替换

C# c正则表达式替换,c#,regex,C#,Regex,我正在创建一个工具,允许我按值移动数字。它具有以下特点: 1个文本框,用于保存所有值 3个文本框,用于输入修改后的值X、Y、Z 1个按钮启动该过程 当我单击按钮时,它首先找到正则表达式匹配项: string regex = @"((E6POS [\w]*={)X\s([\d.-]*)\s*,*Y\s*([-.\d]*)\s*,Z\s*([-\d.]*))"; Regex r = new Regex(regex, RegexOptions.IgnoreCase); 然后我得到了匹配项: Matc

我正在创建一个工具,允许我按值移动数字。它具有以下特点:

1个文本框,用于保存所有值 3个文本框,用于输入修改后的值X、Y、Z 1个按钮启动该过程

当我单击按钮时,它首先找到正则表达式匹配项:

string regex = @"((E6POS [\w]*={)X\s([\d.-]*)\s*,*Y\s*([-.\d]*)\s*,Z\s*([-\d.]*))";
Regex r = new Regex(regex, RegexOptions.IgnoreCase);
然后我得到了匹配项:

Match m = r.Match(txt.Text);
// once this is finished I parse through the matches and take the values and parse them. 

while (m.Success)
{
    this.Cursor = Cursors.WaitCursor;

    try
    {
        xf = Convert.ToDecimal(m.Groups[3].ToString()) + Convert.ToDecimal(shiftX.Text);
        yf = Convert.ToDecimal(m.Groups[4].ToString()) + Convert.ToDecimal(shiftY.Text);
        zf = Convert.ToDecimal(m.Groups[5].ToString()) + Convert.ToDecimal(shiftZ.Text);

        txt.ReplaceAll(m.Groups[0].ToString(), string.Format("{0} X {1},Y {2}, Z {3}", m.Groups[2].ToString(), xf.ToString(), yf.ToString(), zf.ToString()));
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    finally
    {
        m = m.NextMatch();
    }
}
this.Cursor = Cursors.Default;
有没有更快的方法可以做到这一点?执行此任务最多需要30秒

示例输入文本将是

DECL E6POS XJV_MOVE_3={X 3887.44,Y 0.00,Z 2594.00,A 0.00,B 90.00,C 180.00,S 22,T 18,E1 2654.30,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0} DECL E6POS XAX749_55_2654_3155075={X 4016.8440,Y-774.9973,Z 1437.1283,A 90.0000,B-45.0000,C-90.0000,S 22,T 26,E1 2654.3000,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0} DECL E6POS XAX755_55_2654_3155075={X 4016.8440,Y-810.9183,Z 1473.0493,A 90.0000,B-45.0000,C-90.0000,S 22,T 26,E1 2654.3000,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0} DECL FDAT FAX755_55_2654_3155075={TOOL_NO 1,BASE_NO 0,IPO_FRAME BASE,POINT2[]} DECL LDAT LAX755_55_2654_3155075={2.0级,ACC 88.0,APO_DIST 100.0,APO_FAC 50.0,ORI_TYP VAR}
;从第1411行开始折叠,我猜这三个文本框包含shiftX、shiftY和shiftZ的值。在这种情况下,将Convert.ToDecimal移到循环外循环内固定值的Convert.ToDecimal,固定值如:所示。这将节省一些处理


另外:尝试将新值保存在临时变量中,而不是保存在结果文本框中。这可能会节省一些时间渲染一个无论如何都会更改的值。

我认为您的问题在别处。你怎么测量

因为我不知道你的ReplaceAll是什么,所以我把它改为string.Replace。然后我运行了你的代码。花了1毫秒。下面是我跑的。您可以自己编译和运行这段代码,并测量它在您的机器上执行的时间

using System;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace SO6329015
{
    class Program
    {
        static void Main()
        {
            string input = @"DECL E6POS XJV_MOVE_3={X 3887.44,Y 0.00,Z 2594.00, A 0.00, B 90.00, C 180.00,S 22,T 18,E1 2654.30,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0 } DECL E6POS XAX749_55_2654_3155075={X 4016.8440,Y -774.9973,Z 1437.1283, A 90.0000, B -45.0000, C -90.0000,S 22,T 26,E1 2654.3000,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0 } DECL E6POS XAX755_55_2654_3155075={X 4016.8440,Y -810.9183,Z 1473.0493, A 90.0000, B -45.0000, C -90.0000,S 22,T 26,E1 2654.3000,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0 } DECL FDAT FAX755_55_2654_3155075={TOOL_NO 1, BASE_NO 0, IPO_FRAME #BASE, POINT2[] "" ""} DECL LDAT LAX755_55_2654_3155075={ VEL 2.0,ACC 88.0, APO_DIST 100.0, APO_FAC 50.0, ORI_TYP #VAR} ;FOLD From Line 1411";
            const string regex = @"((E6POS [\w]*={)X\s([\d.-]*)\s*,*Y\s*([-.\d]*)\s*,Z\s*([-\d.]*))";

            const string shiftX = "7777";
            const string shiftY = "8888";
            const string shiftZ = "9999";

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            Regex r = new Regex(regex, RegexOptions.IgnoreCase);

            Match m = r.Match(input);

            while (m.Success)
            {
                try
                {
                    var xf = Convert.ToDecimal(m.Groups[3].ToString()) + Convert.ToDecimal(shiftX);
                    var yf = Convert.ToDecimal(m.Groups[4].ToString()) + Convert.ToDecimal(shiftY);
                    var zf = Convert.ToDecimal(m.Groups[5].ToString()) + Convert.ToDecimal(shiftZ);

                    input = input.Replace(m.Groups[0].ToString(), string.Format("{0} X {1},Y {2}, Z {3}", m.Groups[2], xf, yf, zf));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                finally
                {
                    m = m.NextMatch();
                }
            }

            stopwatch.Stop();
            Console.WriteLine("{0}ms", stopwatch.ElapsedMilliseconds);
            Console.WriteLine(input);

        }
    }
}

请提供输入和输出示例。使其更快的第一步是对其进行概要分析。否则,您认为我们应该加快什么?您的while循环可以用r.Matchestxt.Text中的foreachMatchM替换-但我怀疑正则表达式本身和解析的值是一个大问题。此外,如果始终存在一个已知的文本框,即3个文本框,你可以使用不同的线程来完成每一个工作流。线程可以吗?因为我实际上想一次重写一行,我想不会花这么长时间。问题是,该操作在此文件中执行了718次。输入文本比我提交的文本大得多。它的长度超过1700行