public void TestAlternationNodeRendering()
        {
            RegexNodeLiteral literal1 = new RegexNodeLiteral(@"\w*");
            RegexNodeLiteral literal2 = new RegexNodeLiteral(@"\d+");
            RegexNodeLiteral literal3 = new RegexNodeLiteral(@"\s?");

            RegexNodeAlternation alternation1 = new RegexNodeAlternation(literal1, literal2);

            Assert.AreEqual(@"(?:\w*|\d+)", alternation1.ToRegexPattern());

            RegexNodeAlternation alternation2 = new RegexNodeAlternation(literal1, literal2, literal3);

            Assert.AreEqual(@"(?:\w*|\d+|\s?)", alternation2.ToRegexPattern());

            RegexNodeAlternation alternation3 = RegexBuilder.Alternate(literal1, literal2);

            Assert.AreEqual(@"(?:\w*|\d+)", alternation3.ToRegexPattern());

            RegexNodeAlternation alternation4 = RegexBuilder.Alternate(new RegexNode[] { literal1, literal2, literal3 });

            Assert.AreEqual(@"(?:\w*|\d+|\s?)", alternation4.ToRegexPattern());

            RegexNodeAlternation alternation5 = new RegexNodeAlternation(literal1, literal2);

            alternation5.Quantifier = RegexQuantifier.ZeroOrMore;
            Assert.AreEqual(@"(?:\w*|\d+)*", alternation5.ToRegexPattern());

            RegexNodeAlternation alternation6 = new RegexNodeAlternation(literal1, literal2, literal3);

            alternation6.Quantifier = RegexQuantifier.OneOrMore;
            Assert.AreEqual(@"(?:\w*|\d+|\s?)+", alternation6.ToRegexPattern());

            RegexNodeAlternation alternation7 = RegexBuilder.Alternate(literal1, literal2, RegexQuantifier.ZeroOrOne);

            Assert.AreEqual(@"(?:\w*|\d+)?", alternation7.ToRegexPattern());

            RegexNodeAlternation alternation8 = RegexBuilder.Alternate(new RegexNode[] { literal1, literal2, literal3 }, RegexQuantifier.AtLeast(5));

            Assert.AreEqual(@"(?:\w*|\d+|\s?){5,}", alternation8.ToRegexPattern());
        }
        public void TestGroupReferenceNodeRendering()
        {
            RegexNodeGroupReference reference1 = new RegexNodeGroupReference(1);

            Assert.AreEqual(@"\1", reference1.ToRegexPattern());

            RegexNodeGroupReference reference2 = new RegexNodeGroupReference("SomeGroup");

            Assert.AreEqual(@"\k<SomeGroup>", reference2.ToRegexPattern());

            RegexNodeGroupReference reference3 = RegexBuilder.GroupBackReference("SomeGroup");

            Assert.AreEqual(@"\k<SomeGroup>", reference3.ToRegexPattern());

            RegexNodeGroupReference reference4 = RegexBuilder.GroupBackReference("SomeGroup", RegexQuantifier.Exactly(2));

            Assert.AreEqual(@"\k<SomeGroup>{2}", reference4.ToRegexPattern());

            RegexNodeGroupReference reference5 = RegexBuilder.GroupBackReference(1, RegexQuantifier.ZeroOrMore);

            Assert.AreEqual(@"\1*", reference5.ToRegexPattern());
        }
Пример #3
0
        public void TestEmailValidator()
        {
            const string quotationMark          = "\"";
            const string alphaCharacters        = "a-zA-Z";
            const string alphaNumericCharacters = "0-9a-zA-Z";
            const string allowedLoginSymbols    = "-!#$%&'*+=?^`{}|~";

            // Regex value taken from MSDN: http://msdn.microsoft.com/en-us/library/01escwtf.aspx
            Regex emailRegex = RegexBuilder.Build
                               (
                RegexBuilder.MetaCharacter(RegexMetaChars.LineStart),
                // Match everything before @
                RegexBuilder.ConditionalMatch
                (
                    // If the string starts with a quotation mark...
                    RegexBuilder.Literal(quotationMark),
                    // ...then match the quoted text and the @ character...
                    RegexBuilder.Concatenate
                    (
                        RegexBuilder.Literal(quotationMark),
                        RegexBuilder.MetaCharacter(RegexMetaChars.AnyCharacter, RegexQuantifier.OneOrMoreLazy),
                        RegexBuilder.Literal(quotationMark),
                        RegexBuilder.Literal("@")
                    ),
                    // ...otherwise, match a sequence of alphanumeric characters and symbols, followed by @
                    RegexBuilder.Concatenate
                    (
                        RegexBuilder.CharacterSet(alphaNumericCharacters, RegexQuantifier.None),
                        RegexBuilder.Alternate
                        (
                            // The sequence can either contain only one dot...
                            RegexBuilder.NegativeLookAhead
                            (
                                RegexBuilder.Literal("."),
                                RegexBuilder.Literal(".")
                            ),
                            // ...or contain some special symbols (-!#$%&'*+=?^`{}|~)
                            RegexBuilder.CharacterSet(allowedLoginSymbols + RegexMetaChars.WordCharacter, RegexQuantifier.ZeroOrMore),

                            RegexQuantifier.ZeroOrMore
                        ),
                        // Before matching the @ character, make sure that it is preceded by alphanumeric characters.
                        RegexBuilder.PositiveLookBehind
                        (
                            RegexBuilder.CharacterSet(alphaNumericCharacters, RegexQuantifier.None),
                            RegexBuilder.Literal("@")
                        )
                    )
                ),
                // Match everything after @
                RegexBuilder.ConditionalMatch
                (
                    // Domain can be either an IP address enclosed in square brackets...
                    RegexBuilder.Literal("["),
                    // ...(IP address should look like [aaa.bbb.ccc.ddd])...
                    RegexBuilder.Concatenate
                    (
                        RegexBuilder.Literal("["),
                        RegexBuilder.Concatenate
                        (
                            RegexBuilder.MetaCharacter(RegexMetaChars.Digit, RegexQuantifier.Custom(1, 3, false)),
                            RegexBuilder.Literal("."),
                            RegexQuantifier.Exactly(3)
                        ),
                        RegexBuilder.MetaCharacter(RegexMetaChars.Digit, RegexQuantifier.Custom(1, 3, false)),
                        RegexBuilder.Literal("]")
                    ),
                    // ...or it can be a hostname.
                    RegexBuilder.Concatenate
                    (
                        RegexBuilder.Concatenate
                        (
                            RegexBuilder.CharacterSet(alphaNumericCharacters, RegexQuantifier.None),
                            RegexBuilder.CharacterSet("-" + RegexMetaChars.WordCharacter, RegexQuantifier.ZeroOrMore),
                            RegexBuilder.CharacterSet(alphaNumericCharacters, RegexQuantifier.None),
                            RegexBuilder.Literal("."),
                            RegexQuantifier.OneOrMore
                        ),
                        RegexBuilder.CharacterSet(alphaCharacters, RegexQuantifier.Custom(2, 6, false))
                    )
                ),
                RegexBuilder.MetaCharacter(RegexMetaChars.LineEnd)
                               );

            Assert.IsTrue(emailRegex.IsMatch("*****@*****.**"));
            Assert.IsTrue(emailRegex.IsMatch("*****@*****.**"));
            Assert.IsTrue(emailRegex.IsMatch("*****@*****.**"));
            Assert.IsFalse(emailRegex.IsMatch("*****@*****.**"));
            Assert.IsFalse(emailRegex.IsMatch("[email protected]"));
            Assert.IsTrue(emailRegex.IsMatch("js#[email protected]"));
            Assert.IsTrue(emailRegex.IsMatch("j_9@[129.126.118.1]"));
            Assert.IsFalse(emailRegex.IsMatch("*****@*****.**"));
            Assert.IsFalse(emailRegex.IsMatch("js*@proseware.com"));
            Assert.IsFalse(emailRegex.IsMatch("*****@*****.**"));
            Assert.IsFalse(emailRegex.IsMatch("[email protected]"));
            Assert.IsTrue(emailRegex.IsMatch("*****@*****.**"));
        }