2011-06-13 8 views
0

값으로 숫자를 이동할 수있는 도구를 만들고 있습니다. 프로세스를 시작하는 모든 값을 수정 값 (X, Y, Z)
1 버튼의 항목에 대한
3 텍스트 상자를 저장할C# regex replace

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 초가 소요됩니다.

샘플 입력 텍스트 것

= {X 3887.44

DECL E6POS XJV_MOVE_3, Y 0.00, Z 2594.00, 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 E20 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 보낸 사람 1411

+0

샘플 입력 및 출력을 제공하십시오. –

+1

빨리 만들기위한 첫 번째 단계는 프로파일 링하는 것입니다. 그렇지 않으면 우리는 무엇을 빨리 만들어야한다고 생각합니까? – Snowbear

+0

while 루프는 foreach (MatchM in r.Matches (txt.Text))로 대체 될 수 있습니다. 그러나 정규 표현식 자체와 파싱 된 값이 큰 문제로 의심됩니다. –

답변

0

그 3 개의 텍스트 상자에는 shiftX, shiftY 및 shiftZ 값이 들어 있다고 생각합니다. 이 경우 해당 고정 값의 "Convert.ToDecimal"을 이동하십시오. (고정 : 루프 내에서 변경되지 않음) 루프가 없습니다. 그러면 일부 처리가 절약됩니다.

기타 : 결과 값 텍스트 상자 대신 임시 변수에 새 값을 넣으십시오. 그것은 어쨌든 변경 될 값을 렌더링하는데 약간의 시간을 절약 할 수 있습니다.

0

다른 문제가 있다고 생각합니다. 어떻게 측정하나요?

귀하의 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); 

     } 
    } 
} 
+0

입력 한 텍스트가 제출 한 것보다 훨씬 큽니다. 길이가 1700 줄을 넘습니다. – charles