c# regex replace

本文关键字:replace regex | 更新日期: 2023-09-27 17:58:56

我正在创建一个工具,它将允许我按值移位数字。它有以下几种:

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-900000,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-900000,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};FOLD来自1411行

c# regex replace

我猜这三个文本框包含shiftX、shiftY和shiftZ的值。在这种情况下,将这些固定值的"Convert.ToDecimal"(固定为:在循环中不更改)移到循环外。这将节省一些处理时间。

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

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

由于我不知道你的ReplaceAll是什么,我把它改成了字符串。代替然后我运行了你的代码。它花费了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);
        }
    }
}