/// <summary> /// Reg expression 3 testData /// </summary> public TestRegExp() { a = new RegExpression("a"); b = new RegExpression("b"); // expr1: "baa" expr1 = new RegExpression("baa"); // expr2: "bb" expr2 = new RegExpression("bb"); // expr3: "baa | baa" expr3 = expr1.Or(expr2); // all: "(a|b)*" all = (a.Or(b)).Star(); // expr4: "(baa | baa)+" expr4 = expr3.Plus(); // expr5: "(baa | baa)+ (a|b)*" expr5 = expr4.Dot(all); }
/// <summary> /// Converts a string to a regExpressionObject. /// </summary> /// <param name="regexString">The regex string.</param> /// <returns></returns> public RegExpression StringToRegExpression(RegExpression regex, string regexString) { // Remove spaces regexString = regexString.Replace(" ", String.Empty); // Seperate all terminals char[] seperators = { '+', '*', '|', '(', ')' }; List <string> terminalParts = regexString.Split(seperators).ToList(); terminalParts.RemoveAll(x => x == String.Empty); int terminalIndex = 0; int maxTerminals = terminalParts.Count(); int i = 0; while (i < regexString.Length) { char currentChar = regexString[i]; // For everything between ( ) if (currentChar == '(') { int closingBracketPosition = -1; int bracketCount = 0; for (int j = i + 1; i < regexString.Length; j++) { if (regexString[j] == '(') { bracketCount++; } // We found the matching closing bracket if (regexString[j] == ')' && bracketCount == 0) { closingBracketPosition = j; break; } if (regexString[j] == ')' && bracketCount != 0) { bracketCount--; } } // Get the regex for the part between () string between = regexString.Substring(i + 1, closingBracketPosition - 1 - i); RegExpression regExpression = StringToRegExpression(new RegExpression(), between); // Look for the part after closing bracket if (closingBracketPosition + 1 < regexString.Length) { i = closingBracketPosition + 1; currentChar = regexString[i]; if (currentChar == '+') { regExpression = regExpression.Plus(); } else if (currentChar == '*') { regExpression = regExpression.Star(); } } if (regex.terminals == "" && regex.o == Operator.ONE) { regex = regExpression; } else { regex = regex.Dot(regExpression); } } // For all the operators not related to () else if (currentChar == '+') { regex = regex.Plus(); } else if (currentChar == '*') { regex = regex.Star(); } else if (currentChar == '|') { regex = regex.Or(new RegExpression(terminalParts[terminalIndex].ToString())); terminalIndex++; i++; } else { if (regex.terminals == "" && regex.o == Operator.ONE) { regex.terminals = terminalParts[terminalIndex]; // Skip rest of the terminal part in the loop int num = regex.terminals.Count(); i += terminalParts[terminalIndex].Length - 1; terminalIndex++; } else { //regex = regex.Dot(new RegExpression(currentChar.ToString())); } } i++; } //for (int i = 0; i < regexString.Length; i++) //{ // char currentChar = regexString[i]; // // For everything between ( ) // if (currentChar == '(') // { // int closingBracketPosition = -1; // int bracketCount = 0; // for (int j = i + 1; i < regexString.Length; j++) // { // if (regexString[j] == '(') bracketCount++; // // We found the matching closing bracket // if (regexString[j] == ')' && bracketCount == 0) // { // closingBracketPosition = j; // break; // } // if (regexString[j] == ')' && bracketCount != 0) // { // bracketCount--; // } // } // // Get the regex for the part between () // string between = regexString.Substring(i + 1, closingBracketPosition - 1 - i); // RegExpression regExpression = StringToRegExpression(new RegExpression(), between); // // Look for the part after closing bracket // if (closingBracketPosition + 1 < regexString.Length) // { // i = closingBracketPosition + 1; // currentChar = regexString[i]; // if (currentChar == '+') // { // regExpression = regExpression.Plus(); // } // else if (currentChar == '*') // { // regExpression = regExpression.Star(); // } // } // if (regex.terminals == "" && regex.o == Operator.ONE) // { // regex = regExpression; // } // else // { // regex = regex.Dot(regExpression); // } // } // // For all the operators not related to () // else if (currentChar == '+') // { // regex = regex.Plus(); // } // else if (currentChar == '*') // { // regex = regex.Star(); // } // else if (currentChar == '|') // { // regex = regex.Or(new RegExpression(terminalParts[terminalIndex].ToString())); // terminalIndex++; // i++; // } // else // { // if (regex.terminals == "" && regex.o == Operator.ONE) // { // regex.terminals = terminalParts[terminalIndex]; // // Skip rest of the terminal part in the loop // int num = regex.terminals.Count(); // i += terminalParts[terminalIndex].Length - 1; // terminalIndex++; // } // else // { // //regex = regex.Dot(new RegExpression(currentChar.ToString())); // } // } //} return(regex); }