static void _RunFromFA() { var expr = RegexExpression.Parse("(0*11*0[01]*)"); var fa = expr.ToFA <string>(); fa.IsAccepting = true; // modify the expression by changing the FSM var x = new CharFA <string>(); var y = new CharFA <string>(); var z = new CharFA <string>(true); x.InputTransitions.Add('a', y); y.InputTransitions.Add('b', y); y.InputTransitions.Add('c', z); fa = x; var test = "[A-Z_a-z][0-9A-Z_a-z]*"; //test = "ab*c"; test = "(foo)*bar"; fa = RegexExpression.Parse(test).ToFA <string>(); fa.RenderToFile(@"..\..\..\test_expr_nfa.jpg"); var ffa = fa.ToDfa(); ffa.RenderToFile(@"..\..\..\test_expr.jpg"); expr = RegexExpression.FromFA(fa); Console.WriteLine(expr); fa.RenderToFile(@"..\..\..\test_nfa.jpg"); var dfa = fa.ToDfa(); dfa.RenderToFile(@"..\..\..\test.jpg"); }
string Interpret(string regex) { RegexBuffer buffer = new RegexBuffer(regex); RegexExpression expression = new RegexExpression(buffer); string output = expression.ToString(0); return output; }
public RegexConditional(RegexBuffer buffer) { this.startLocation = buffer.Offset; this.expression = new RegexExpression(buffer); this.CheckClosingParen(buffer); this.yesNo = new RegexExpression(buffer); this.CheckClosingParen(buffer); buffer.AddLookup(this, this.startLocation, buffer.Offset - 1); }
public Regex( bool startsWith, RegexExpression expression, bool endsWith) { StartsWith = startsWith; EndsWith = endsWith; Expression = expression; _hashCode = ComputeHashCode(); }
public ActionResult Create(RegexExpression model, string[] nonMatch,string[] match ) { model.CreateDate = DateTime.Now; model.ClickCount = 0; model.UserID = FrontContext.CurrentRegexUser.ID; model.NonMatches = StringUtility.ArrayJoin(nonMatch.Where(x=>!string.IsNullOrEmpty(x)).ToArray(),"|||"); model.Matches = StringUtility.ArrayJoin(match.Where(x =>! string.IsNullOrEmpty(x)).ToArray(), "|||"); bizRegexExpression.Save(model); return Redirect(string.Format("/{0}",FrontContext.CurrentRegexUser.Name)); }
public ActionResult Edit(RegexExpression model, string[] nonMatch, string[] match,string c,int? p) { RegexExpression original = bizRegexExpression.GetByID(model.ID); original.NonMatches = StringUtility.ArrayJoin(nonMatch.Where(x => !string.IsNullOrEmpty(x)).ToArray(), "|||"); original.Matches = StringUtility.ArrayJoin(match.Where(x => !string.IsNullOrEmpty(x)).ToArray(), "|||"); original.Expression = model.Expression; original.Description = model.Description; original.Title = model.Title; bizRegexExpression.SaveOrUpdate(original); return Redirect(string.Format("/{0}?{1}p={2}&t={3}", FrontContext.CurrentRegexUser.Name, string.IsNullOrEmpty(c)?"":string.Format("c={0}&",c), p, (int)EnumExpressionType.myExpression)); }
static void _RunDom() { var test = "(ABC|DEF)*"; var dom = RegexExpression.Parse(test); Console.WriteLine(dom.ToString()); var rep = dom as RegexRepeatExpression; rep.MinOccurs = 1; Console.WriteLine(dom.ToString()); dom.ToFA("Accept"); Console.WriteLine(); }
private void InterpretRegEx() { this.buffer = new RegexBuffer(this.textBoxRegex.Text) { RegexOptions = this.CreateRegexOptions() }; try { RegexExpression exp = new RegexExpression(this.buffer); this.textBoxInterpretation.Text = exp.ToString(0); this.textBoxInterpretation.ForeColor = Color.Black; } catch (Exception ex) { this.textBoxInterpretation.Text = "We have a situation...\r\n\r\n (" + ex.Message + ")"; this.textBoxRegex.Focus(); this.textBoxInterpretation.ForeColor = Color.Gray; } }
static void Main() { var sw = Stopwatch.StartNew(); var a = RegexExpression.Parse(@"a.+a").ToFA <string>(); Console.WriteLine(sw.ElapsedMilliseconds); a.RenderToFile("tmp.png"); // _BuildArticleImages() // requires GraphViz // _RunCompiledLexCodeGen() /*_RunLexer(); * _RunMatch(); * _RunDom(); * // the following require GraphViz * _RunStress(); * _RunStress2();*/ }
/// <summary> /// Initializes a new instance of the <see cref="RegexConditional"/> class. /// </summary> /// <param name="buffer">The buffer.</param> public RegexConditional(RegexBuffer buffer) { if (buffer == null) { throw new ArgumentNullException("buffer", "RegexBuffer is null"); } this.startLocation = buffer.Offset; this.expression = new RegexExpression(buffer); this.CheckClosingParen(buffer); this.yesNo = new RegexExpression(buffer); this.CheckClosingParen(buffer); buffer.AddLookup(this, this.startLocation, buffer.Offset - 1); }
static void _RunStress() { // C# keywords const string cskw = "abstract|add|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|equals|explicit|extern|false|finally|fixed|float|for|foreach|get|global|goto|if|implicit|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|var|virtual|void|volatile|while|yield"; var expr = RegexExpression.Parse(cskw); var fa = expr.ToFA(""); Console.WriteLine("C# keyword NFA has {0} states.", fa.FillClosure().Count); Console.WriteLine("Reducing C# keywords"); // very expensive in this case fa = fa.Reduce(new _ConsoleProgress()); Console.WriteLine(); Console.WriteLine("C# keyword DFA has {0} states.", fa.FillClosure().Count); var dopt = new CharFA <string> .DotGraphOptions(); dopt.Dpi = 150; // make the image smaller Console.WriteLine("Rendering stress.jpg"); fa.RenderToFile(@"..\..\..\stress.jpg", dopt); }
public RegexAtomExpression(RegexExpression expression) { Expression = expression; }
public static string Interpret(string regex) { RegexBuffer buffer = new RegexBuffer(regex); RegexExpression expression = new RegexExpression(buffer); return expression.ToString(0); }
private string[] CompileToLiterals(RegexExpression exp, string seed = "") { if (exp is BinaryExpression) { var binExp = exp as BinaryExpression; string[] leftLiterals = CompileToLiterals(binExp.Left), rightLiterals = CompileToLiterals(binExp.Right); if (rightLiterals != null) { var combinedStrings = leftLiterals.SelectMany(x => rightLiterals.Select(y => x + y)); if (binExp.Operator == RegexTokenType.OrOperator) { return leftLiterals.Concat(rightLiterals).ToArray(); } else { return combinedStrings.ToArray(); } } else { return leftLiterals; } } else if (exp is GroupExpression) { var groupExp = exp as GroupExpression; var literals = CompileToLiterals(groupExp.Expression, seed); if (groupExp.Quantifier == RegexTokenType.ZeroOrOneQuantifier) { return literals.Concat(new[] { "" }).ToArray(); } else if (groupExp.Quantifier != RegexTokenType.None) { throw new InvalidOperationException( string.Format("Unsupported quantifier: {0}", groupExp.Quantifier)); } return literals; } else if (exp is CharExpression) { var charExp = exp as CharExpression; if (charExp.Quantifier == RegexTokenType.None) { return new string[] { seed + charExp.Char }; } else { throw new InvalidOperationException( string.Format("Unsupported quantifier: {0}", charExp.Quantifier)); } } else throw new InvalidOperationException(); }
static void _BuildArticleImages() { // this generates the figures used in the code project article // at https://www.codeproject.com/Articles/5251476/How-to-Build-a-Regex-Engine-in-Csharp var litA = CharFA <string> .Literal("ABC", "Accept"); litA.RenderToFile(@"..\..\..\literal.jpg"); var litAa = CharFA <string> .CaseInsensitive(litA, "Accept"); litAa.RenderToFile(@"..\..\..\literal_ci.jpg"); var opt = CharFA <string> .Optional(litA, "Accept"); opt.RenderToFile(@"..\..\..\optional.jpg"); var litB = CharFA <string> .Literal("DEF"); var or = CharFA <string> .Or(new CharFA <string>[] { litA, litB }, "Accept"); or.RenderToFile(@"..\..\..\or.jpg"); var set = CharFA <string> .Set("ABC", "Accept"); set.RenderToFile(@"..\..\..\set.jpg"); var loop = CharFA <string> .Repeat(litA, 1, -1, "Accept"); loop.RenderToFile(@"..\..\..\repeat.jpg"); var concat = CharFA <string> .Concat(new CharFA <string>[] { litA, litB }, "Accept"); concat.RenderToFile(@"..\..\..\concat.jpg"); var foobar = CharFA <string> .Or(new CharFA <string>[] { CharFA <string> .Literal("foo"), CharFA <string> .Literal("bar") }, "Accept"); foobar.RenderToFile(@"..\..\..\foobar_nfa.jpg"); var rfoobar = foobar.Reduce(); rfoobar.RenderToFile(@"..\..\..\foobar.jpg"); var lfoobar = CharFA <string> .Repeat(foobar, 1, -1, "Accept"); lfoobar.RenderToFile(@"..\..\..\foobar_loop_nfa.jpg"); var rlfoobar = lfoobar.Reduce(); rlfoobar.RenderToFile(@"..\..\..\foobar_loop.jpg"); var digits = CharFA <string> .Repeat( CharFA <string> .Set("0123456789"), 1, -1 , "Digits"); var word = CharFA <string> .Repeat( CharFA <string> .Set(new CharRange[] { new CharRange('A', 'Z'), new CharRange('a', 'z') }), 1, -1 , "Word"); var whitespace = CharFA <string> .Repeat( CharFA <string> .Set(" \t\r\n\v\f"), 1, -1 , "Whitespace"); var lexer = CharFA <string> .ToLexer(digits, word, whitespace); lexer.RenderToFile(@"..\..\..\lexer.jpg"); var dopt = new CharFA <string> .DotGraphOptions(); dopt.DebugSourceNfa = lexer; var dlexer = lexer.ToDfa(); dlexer.RenderToFile(@"..\..\..\dlexer.jpg", dopt ); dlexer.RenderToFile(@"..\..\..\dlexer2.jpg"); var dom = RegexExpression.Parse("(ABC|DEF)+"); var fa = dom.ToFA("Accept"); fa.RenderToFile(@"..\..\..\ABCorDEFloop.jpg"); }
public static RegexExpression CreateInsensitive(RegexExpression inner) { return(Create(inner, false)); }
public RegexExpressionAlteration(RegexTerm term, RegexExpression expression) : base(term) { Expression = expression; _hashCode = ComputeHashCode(); }
RegexExpression ParseRegexExpression(string source) { var regex = new RegexExpression(); try { while(_sourceWindow.AdvanceIfMatches("(<#")) { string name; if(!_sourceWindow.AdvanceIfName(out name)) { throw new ArgumentException("Identifier lost."); } if(!_sourceWindow.AdvanceIfMatches('>')) { throw new ArgumentException("> lost."); } var sub = ParseExpression(); if(!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") needed"); } if(regex.Definitions.Keys.Contains(name)) { throw new ArgumentException("name duplicated."); } else { regex.Definitions.Add(name, sub); } } regex.Main = ParseExpression(); if(regex.Main == null) { throw new ArgumentException("Expression Expected."); } if(_sourceWindow.HasMoreChars()) { throw new ArgumentException("Syntax error."); } return regex; } catch(ArgumentException e) { //... throw new ArgumentException(e.Message); } }
public virtual void Accept(RegexExpression regex) { }
public GroupExpression(RegexExpression expression) { Expression = expression; }
private static INfa Expression(RegexExpression expression) { switch (expression.NodeType) { case RegexNodeType.RegexExpression: return Empty(); case RegexNodeType.RegexExpressionAlteration: var regexExpressionAlteration = expression as RegexExpressionAlteration; var termNfa = Term(regexExpressionAlteration.Term); var expressionNfa = Expression(regexExpressionAlteration.Expression); return Union(termNfa, expressionNfa); case RegexNodeType.RegexExpressionTerm: var regexExpressionTerm = expression as RegexExpressionTerm; return Term(regexExpressionTerm.Term); } throw new InvalidOperationException("Unrecognized Regex Expression"); }
public RegexAtomExpression(RegexExpression expression) { Expression = expression; _hashCode = ComputeHashCode(); }
private RegexCaseGroup(RegexExpression inner, bool caseSensitive) { this.Inner = inner; this.CaseSensitive = caseSensitive; }
public RegexExpressionAlteration(IRegexTerm term, RegexExpression expression) { Term = term; Expression = expression; }
public GroupExpression(RegexExpression expression) =>
public static RegexExpression Create(RegexExpression inner, bool caseSensitive) { return((RegexExpression)(inner as RegexNoOp) ?? new RegexCaseGroup(inner, caseSensitive)); }
public static RegexExpression CreateSensitive(RegexExpression inner) { return(Create(inner, true)); }
public SpecflowStepInfo Create(string classFullName, string methodName, GherkinStepKind stepKind, string pattern) { CharFA <string> regexForPartialMatch; try { regexForPartialMatch = RegexExpression.Parse(pattern).ToFA <string>(); } catch (Exception) { regexForPartialMatch = null; } Regex regex; try { var fullMatchPattern = pattern; if (!fullMatchPattern.StartsWith("^")) { fullMatchPattern = "^" + fullMatchPattern; } if (!fullMatchPattern.EndsWith("$")) { fullMatchPattern += "$"; } regex = new Regex(fullMatchPattern, RegexOptions.Compiled, TimeSpan.FromSeconds(2)); } catch (ArgumentException) { regex = null; } var regexesPerCapture = new List <Regex>(); var partialPattern = new StringBuilder(); var error = false; foreach (var(type, text, _) in _stepPatternUtil.TokenizeStepPattern(pattern)) { switch (type) { case StepPatternUtil.StepPatternTokenType.Text: partialPattern.Append(text); break; case StepPatternUtil.StepPatternTokenType.Capture: var captureText = text; if (text == ".+") { captureText = ".+?"; } else if (text == ".*") { captureText = ".*?"; } partialPattern.Append('(').Append(captureText).Append(")"); try { regexesPerCapture.Add(new Regex("^" + partialPattern + "(?:(?:[ \"\\)])|$)", RegexOptions.Compiled)); } catch (ArgumentException) { error = true; } break; default: throw new ArgumentOutOfRangeException(); } if (error) { break; } } return(new SpecflowStepInfo(classFullName, methodName, stepKind, pattern, regex, regexForPartialMatch, regexesPerCapture)); }
public BinaryExpression(RegexExpression left, RegexTokenType op, RegexExpression right) { Left = left; Operator = op; Right = right; }
public void InsertContacts() { Console.WriteLine(); Console.WriteLine("Add a new Contact"); var temp1 = true; ContactInfo obj = new ContactInfo(); try { do { Console.Write("First Name\t:\t"); obj.firstName = Console.ReadLine(); var fname1 = RegexExpression.NameValidation(obj.firstName); temp1 = SatisfyCondition(fname1, "name"); }while (temp1 == false); Console.Write("Middle Name\t:\t"); obj.middleName = Console.ReadLine(); var mname1 = RegexExpression.NameValidation(obj.middleName); temp1 = SatisfyCondition(mname1, "name"); Console.Write("Last Name\t:\t"); obj.lastName = Console.ReadLine(); var lname1 = RegexExpression.NameValidation(obj.lastName); temp1 = SatisfyCondition(lname1, "name"); do { Console.Write("Date of Birth (DD-MM-YYYY)\t:\t"); // string datestring = Console.ReadLine(); DateTime birth; // obj.Birthday = if (DateTime.TryParse(Console.ReadLine(), out birth)) { obj.Birthday = birth; } else { Console.WriteLine("Date is not valid"); } var Birthday1 = RegexExpression.IsValidDate(obj.Birthday); temp1 = SatisfyCondition(Birthday1, "Date"); // obj.Birthday = Convert.ToDateTime(datestring); }while (temp1 == false); do { try { Console.Write("Email\t:\t"); obj.Email = Console.ReadLine(); var Email1 = RegexExpression.IsEmail(obj.Email); temp1 = SatisfyCondition(Email1, "email"); } catch (Exception) { Console.WriteLine("Enter the valid date"); } }while (temp1 == false); do { Console.Write("Work Number\t:\t"); obj.WorkNumber = Console.ReadLine(); var WorkNumber1 = RegexExpression.HomePhoneNumber(obj.WorkNumber); temp1 = SatisfyCondition(WorkNumber1, "phone"); }while (temp1 == false); do { Console.Write("Home Number\t:\t"); obj.HomeNumber = Console.ReadLine(); var HomeNumber1 = RegexExpression.HomePhoneNumber(obj.HomeNumber); temp1 = SatisfyCondition(HomeNumber1, "phone"); }while (temp1 == false); do { Console.Write("Mobile Number\t:\t"); obj.MobileNumber = Console.ReadLine(); var MobileNumber1 = RegexExpression.IsPhoneNumber(obj.MobileNumber); temp1 = SatisfyCondition(MobileNumber1, "mobile"); }while (temp1 == false); // do // { // Console.Write("Active status\t:\t"); // obj.IsActive = Convert.ToBoolean(Console.ReadLine()); // var IsActive1 = RegexExpression.IsActivecheck(obj.IsActive); // temp1 = SatisfyCondition(IsActive1, "isactive"); // } // while (temp1 == false); } catch (Exception e) { Console.WriteLine(e.Message); } //ValidationContext context = new ValidationContext(obj, null, null); //List<ValidationResult> results = new List<ValidationResult>(); //bool valid = Validator.TryValidateObject(obj, context, results, true); //if (!valid) //{ // foreach (ValidationResult vr in results) // { // Console.ForegroundColor = ConsoleColor.Blue; // // Console.Write("Member Name :{0}", vr.MemberNames.First()); // // Console.Write("Member Name :{0}", vr.MemberNames); // Console.ForegroundColor = ConsoleColor.Red; // Console.Write(" :: {0}{1}", vr.ErrorMessage, Environment.NewLine); // } //} //Console.ForegroundColor = ConsoleColor.White; //Console.WriteLine("\nPress any key to exit"); //Console.ReadKey(); try { // productProcess process = new productProcess(); bool status = c1.InsertNewContact(obj); if (status == true) { Console.WriteLine("\nContact Successfully added"); } else { Console.WriteLine("Insertion failed"); } } catch (Exception e) { Console.WriteLine(e.Message); } }
public RegexCompiler(RegexExpression expression) { _expression = expression; }
public void UpdateContacts() { Console.WriteLine(); Console.WriteLine("Update Contact Details"); ContactInfo obj = new ContactInfo(); Console.WriteLine("Enter the ContactId that you want to update"); obj.ContactId = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Update the Fields that you want to update"); //Console.Write("First Name\t:\t"); //obj.firstName = Console.ReadLine(); //Console.Write("Middle Name\t:\t"); //obj.middleName = Console.ReadLine(); //Console.Write("Last Name\t:\t"); //obj.lastName = Console.ReadLine(); //Console.Write("Date of Birth (YY/MM/DD)\t:\t"); //obj.Birthday = Convert.ToDateTime(Console.ReadLine()); //Console.Write("Email\t:\t"); //obj.Email = Console.ReadLine(); //Console.Write("Work Number\t:\t"); //obj.WorkNumber = Console.ReadLine(); //Console.Write("Home Number\t:\t"); //obj.HomeNumber = Console.ReadLine(); //Console.Write("Mobile Number\t:\t"); //obj.MobileNumber = Console.ReadLine(); //Console.Write("Active status\t:\t"); //obj.IsActive = Convert.ToBoolean(Console.ReadLine()); //WelcomePage w1 = new WelcomePage(); //w1.Test2(obj.ContactId); var st1 = c1.ShowContactInfoById(obj.ContactId); Console.Write("First Name\t':{0}'\t Update FirstName:\t", st1.firstName); obj.firstName = Console.ReadLine().ToString(); if (obj.firstName == "" || obj.firstName == null) { st1.firstName = obj.firstName; } var fname1 = RegexExpression.NameValidation(obj.firstName); Console.Write("Middle Name\t:{0}'\tUpdate MiddleName:\t", st1.middleName); obj.middleName = Console.ReadLine().ToString(); var mname1 = RegexExpression.NameValidation(obj.middleName); Console.Write("Last Name\t:'{0}'\tUpdate LastName:\t", st1.lastName); obj.lastName = Console.ReadLine().ToString(); var lname1 = RegexExpression.NameValidation(obj.lastName); Console.Write("Date of Birth (DD-MM-YYYY)\t:\t :'{0}'\t Update BirthDate\t:", st1.Birthday); // string datestring = Console.ReadLine(); DateTime birth; // obj.Birthday = try { if (DateTime.TryParse(Console.ReadLine(), out birth)) { obj.Birthday = birth; } //else //{ // Console.WriteLine("Date is not valid"); //} } catch (Exception e) { Console.WriteLine("DateTime is not valid"); } var Birthday1 = RegexExpression.IsValidDate(obj.Birthday); try { Console.Write("Email\t: '{0}'\tUpdate Email ID:\t", st1.Email); obj.Email = Console.ReadLine(); var Email1 = RegexExpression.IsEmail(obj.Email); } catch (Exception) { Console.WriteLine("Enter the valid date"); } Console.Write("Work Number :'{0}'\tUpdate Work Number:\t", st1.WorkNumber); obj.WorkNumber = Console.ReadLine(); var WorkNumber1 = RegexExpression.HomePhoneNumber(obj.WorkNumber); Console.Write("Home Number :'{0}'\tUpdate Home Number:\t", st1.HomeNumber); obj.HomeNumber = Console.ReadLine(); var HomeNumber1 = RegexExpression.HomePhoneNumber(obj.HomeNumber); Console.Write("Mobile Number :'{0}'\tUpdate Mobile Number:\t", st1.MobileNumber); obj.MobileNumber = Console.ReadLine(); var MobileNumber1 = RegexExpression.IsPhoneNumber(obj.MobileNumber); try { // productProcess process = new productProcess(); Contact c1 = new Contact(); // c1.UpdateContact(obj); bool status = c1.UpdateContact(obj); if (status == true) { Console.WriteLine("\nContact Successfully Updated"); } else { Console.WriteLine("Updation failed"); } // ContactInfointer.GetDetails(obj); // Console.WriteLine("\nProduct Successfully added"); } catch (Exception e) { Console.WriteLine(e.Message); } }
private int CountStrings(RegexExpression exp, int seed = 1) { var x = seed; if (exp.Quantifier == RegexTokenType.ZeroOrOneQuantifier) { x++; } if (exp is BinaryExpression) { var binExp = (exp as BinaryExpression); if (binExp.Operator == RegexTokenType.OrOperator) { x++; } x += CountStrings(binExp.Left, 0) + CountStrings(binExp.Right, 0); } else if (exp is GroupExpression) { var groupExp = (exp as GroupExpression); x += CountStrings(groupExp.Expression, 0); } return x; }