/// <summary>
 /// Defines a noncapturing group.
 /// </summary>
 /// <example>
 /// Pattern: Write(?:Line)?
 /// Expected result: matches "WriteLine" in "Console.WriteLine()" and "Write" in "Console.Write(value)"
 /// </example>
 /// <param name="subExpression">The subexpression that must be matched but not captured</param>
 /// <returns>(?:{subExpression})</returns>
 public RegExBuilderQuantifiers NonCaptureGroup(RegExBuilder subExpression) => AddToStreamReturnQuantifiers($"(?:{subExpression.Build()})");
 /// <summary>
 /// Zero-width positive lookahead assertion.
 /// </summary>
 /// <example>
 /// Pattern: \b\w+\b(?=.+and.+)
 /// Expected result: matches "cats", "dogs" in "cats, dogs and some mice."
 /// </example>
 /// <param name="subExpression">The subexpression to be matched</param>
 /// <returns>(?={subExpression})</returns>
 public RegExBuilderQuantifiers PositiveLookAhead(RegExBuilder subExpression) => AddToStreamReturnQuantifiers($"(?={subExpression.Build()})");
 /// <summary>
 /// A balancing group definition deletes the definition of a previously defined group and stores, in the current group,
 /// the interval between the previously defined group and the current group.
 /// The balancing group definition deletes the definition of name2 and stores the interval between name2 and name1 in name1.
 /// If no name2 group is defined, the match backtracks. Because deleting the last definition of name2 reveals the previous definition
 /// of name2, this construct lets you use the stack of captures for group name2 as a counter for keeping track of nested constructs
 /// such as parentheses or opening and closing brackets.
 /// The balancing group definition uses name2 as a stack.
 /// The beginning character of each nested construct is placed in the group and in its Group.Captures collection.
 /// When the closing character is matched, its corresponding opening character is removed from the group, and the Captures
 /// collection is decreased by one.After the opening and closing characters of all nested constructs have been matched, name2 is empty.
 /// </summary>
 /// <seealso cref="https://docs.microsoft.com/en-us/dotnet/standard/base-types/grouping-constructs-in-regular-expressions#balancing_group_definition"/>
 /// <example>
 /// Pattern: (((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$
 /// Expected result: matches "((1-3)*(3-1))" in "3+2^((1-3)*(3-1))"
 /// </example>
 /// <param name="subExpression">The subexpression to be captured</param>
 /// <param name="name1">The name of the current group.</param>
 /// <param name="name2">The name of a previously defined group.</param>
 /// <param name="useSingleQuotesInsteadOfBrackets">If <value>true</value> will use single quotes instead of brackets to define the group name</param>
 /// <returns>(?<{name1}-{name2}>{subExpression}) or (?'{name1}-{name2}'{subExpression}) if <value>useSingleQuotesInsteadOfBrackets</value> is <value>true</value></returns>
 public RegExBuilderQuantifiers BalancingGroup(RegExBuilder subExpression, string name1, string name2, bool useSingleQuotesInsteadOfBrackets = false)
 => AddToStreamReturnQuantifiers(useSingleQuotesInsteadOfBrackets
         ? $"(?<{name1}-{name2}>{subExpression.Build()})"
         : $"(?'{name1}-{name2}'{subExpression.Build()})");
 /// <summary>
 /// Atomic group.
 /// </summary>
 /// <example>
 /// Pattern 1: (?>a|ab)c
 /// Expected result 1: matches "ac" in"ac". Matches nothing in"abc".
 ///
 /// Pattern 2: (?>ab|a)c
 /// Expected result 2: matches "ac" in"ac" and "abc" in "abc". Matches nothing in"ab".
 /// </example>
 /// <param name="subExpression">The subexpression to be captured</param>
 /// <returns>(?>{subExpression})</returns>
 public RegExBuilderQuantifiers AtomicGroup(RegExBuilder subExpression) => AddToStreamReturnQuantifiers($"(?>{subExpression.Build()})");
 /// <summary>
 /// Zero-width negative lookbehind assertion.
 /// </summary>
 /// <example>
 /// Pattern 1: \b\w+\b(?<!.+and.+)
 /// Expected result 1: matches "cats", "dogs", "and" in "cats, dogs and some mice."
 ///
 /// Pattern 2: \b\w+\b(?<!.+and.*)
 /// Expected result 2: matches "cats", "dogs" in "cats, dogs and some mice."
 /// </example>
 /// <param name="subExpression">The subexpression to be matched</param>
 /// <returns>(?<!{subExpression})</returns>
 public RegExBuilderQuantifiers NegativeLookBehind(RegExBuilder subExpression) => AddToStreamReturnQuantifiers($"(?<!{subExpression.Build()})");
Example #6
0
 /// <summary>
 /// The match must occur on a boundary between the two "\B" but does not match the anchor characters at the begin and end.
 /// </summary>
 /// <example>
 /// Pattern: \B\w+\s\w+\B
 /// Expected behavior: The match must occur on a boundary between a \w (alphanumeric) and another \w (alphanumeric) characters.
 /// Expected result: "hem theme them the" in "them theme them them"
 /// </example>
 /// <param name="regExBuilder">The regular expression pattern that needs to be matched inside de boundary</param>
 /// <returns>\B<value>regExBuilder</value>\B</returns>
 public RegExBuilder BoundaryExcludeStartAndEndCharacters(RegExBuilder regExBuilder) => AddToStreamReturnQuantifiers($@"\B{regExBuilder.Build()}\B");
Example #7
0
 /// <summary>
 /// The match must occur on a boundary between the two "\b".
 /// </summary>
 /// <example>
 /// Pattern: \b\w+\s\w+\b
 /// Expected behavior: The match must occur on a boundary between a \w (alphanumeric) and another \w (alphanumeric) characters.
 /// Expected result: "them theme", "them them" in "them theme them them"
 /// </example>
 /// <param name="regExBuilder">The regular expression pattern that needs to be matched inside de boundary</param>
 /// <returns>\b<value>regExBuilder</value>\b</returns>
 public RegExBuilder Boundary(RegExBuilder regExBuilder) => AddToStreamReturnQuantifiers($@"\b{regExBuilder.Build()}\b");