繁体   English   中英

c# 正则表达式替换

[英]c# regex replace

我正在创建一个允许我按值移动数字的工具。 它具有以下内容:

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={ VEL 2.0,ACC 88.0, APO_DIST 100.0, APO_FAC 50.0, ORI_TYP #VAR};从第 1411 行折叠

我猜这三个文本框包含 shiftX、shiftY 和 shiftZ 的值。 在这种情况下,将那些固定值的“Convert.ToDecimal”(固定为:在循环内不改变)移出循环。 这将节省一些处理。

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

我认为你的问题在其他地方。 你如何测量?

由于我不知道您的ReplaceAll是什么,所以我将其更改为 string.Replace。 然后我运行了你的代码。 花了1ms 下面是我跑的。 您可以自己编译和运行此代码,并测量它在您的机器上执行的时间。

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);

        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM