Need help modifying my Custom Replace code based on string passed to it
- by fraXis
Hello,
I have a C# program that will open a text file, parse it for certain criteria using a RegEx statement, and then write a new text file with the changed criteria.
For example:
I have a text file with a bunch of machine codes in it such as:
X0.109Y0Z1.G0H2E1
My C# program will take this and turn it into:
X0.109Y0G54G0T3
G43Z1.H2M08
(Note:  the T3 value is really the H value (H2 in this case) + 1).  T = H + 1
It works great, because the line usually always starts with X so the RegEx statement always matches.
My RegEx that works with my first example is as follows:
    //Regex pattern for: 
    //- X(value)Y(value)Z(value)G(value)H(value)E(value) 
    //- X(value)Y(value)Z(value)G(value)H(value)E(value)M(value)
    //- X(value)Y(value)Z(value)G(value)H(value)E(value)A(value)
    //- X(value)Y(value)Z(value)G(value)H(value)E(value)M(value)A(value)
    //value can be positive or negative, integer or floating point number with multiple decimal places or without any
    private Regex regReal = new Regex("^(X([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(Y([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(Z([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(G([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(H([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(E([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(M([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*)?(A([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*)?$");
This RegEx works great because sometimes the line of code could also have an M or A at the end such as:
X0.109Y0Z1.G0H2E1A2
My problem is now I have run into some lines of code that have this:
G90G0X1.5Y-0.036E1Z3.H1
and I need to turn it into this:
G90G0X1.5Y-0.036G54T2
G43Z3.H1M08
Can someone please modify my RegEx and code to turn this:
G90G0X1.5Y-0.036E1Z3.H1
into:
G90G0X1.5Y-0.036G54T2
G43Z3.H1M08
But sometimes the values could be a little different such as:
G(value)G(value)X(value)Y(value)E(value)Z(value)H(value)
G(value)G(value)X(value)Y(value)E(value)Z(value)H(value)A(value)
G(value)G(value)X(value)Y(value)E(value)Z(value)H(value)A(value)(M)value
G(value)G(value)X(value)Y(value)E(value)Z(value)H(value)M(value)(A)value
But also (this is where Z is moved to a different spot)
G(value)G(value)X(value)Y(value)Z(value)E(value)H(value)
G(value)G(value)X(value)Y(value)Z(value)E(value)H(value)A(value)
G(value)G(value)X(value)Y(value)Z(value)E(value)H(value)A(value)(M)value
G(value)G(value)X(value)Y(value)Z(value)E(value)H(value)M(value)(A)value
Here is my code that needs to be changed (I did not include the open and saving of the text file since that is pretty standard stuff).
    //Regex pattern for: 
    //- X(value)Y(value)Z(value)G(value)H(value)E(value) 
    //- X(value)Y(value)Z(value)G(value)H(value)E(value)M(value)
    //- X(value)Y(value)Z(value)G(value)H(value)E(value)A(value)
    //- X(value)Y(value)Z(value)G(value)H(value)E(value)M(value)A(value)
    //value can be pozitive or negative, integer or floating point number with multiple decimal places or without any
    private Regex regReal = new Regex("^(X([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(Y([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(Z([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(G([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(H([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(E([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*){1}(M([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*)?(A([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]*)?$");
    private string CheckAndModifyLine(string line)
    {
        if (regReal.IsMatch(line)) //Check the first Regex with line string
        {
            return CustomReplace(line);
        }
        else
        {
            return line;
        }
    }
   private string CustomReplace(string input)
    {
        string returnValue = String.Empty;
        int zPos = input.IndexOf("Z");
        int gPos = input.IndexOf("G");
        int hPos = input.IndexOf("H");
        int ePos = input.IndexOf("E");
        int aPos = input.IndexOf("A");
        int hValue = Int32.Parse(input.Substring(hPos + 1, ePos - hPos - 1)) + 1; //get H number
        //remove A value
        returnValue = ((aPos == -1) ? input : input.Substring(0, aPos));
        //replace Z value
        returnValue = Regex.Replace(returnValue, "Z[-]?\\d*\\.*\\d*", "G54");
        //replace H value           
        returnValue = Regex.Replace(returnValue, "H\\d*\\.*\\d*", "T" + hValue.ToString() + ((aPos == -1) ? String.Empty : input.Substring(aPos, input.Length - aPos)));
        //replace E, or E and M value
        returnValue = Regex.Replace(returnValue, "E\\d*\\.*\\d(M\\d*\\.*\\d)?", Environment.NewLine + "G43" + input.Substring(zPos, gPos - zPos) + input.Substring(hPos, ePos - hPos) + "M08");
        return returnValue;
    }
I tried to modify the above code to match the new line of text I am encountering (and split into two lines like my first example) but I am failing miserably.
Thanks so much.