/// <summary>
        /// Returns all boundaries matching the pattern in a text
        /// </summary>
        /// <param name="pattern">Search pattern</param>
        /// <param name="text">Text</param>
        /// <returns>List of boundaries</returns>
        private IEnumerable <Boundary> EnumerateMatchingBoundaries(SearchPattern pattern, string text)
        {
            MatchCollection matches    = pattern.Expression.Matches(text);
            var             matchCount = 0;

            foreach (Match m in matches)
            {
                Boundary bound = new Boundary()
                {
                    Index = m.Index, Length = m.Length
                };
                if (ScopeMatch(pattern, bound, text))
                {
                    yield return(bound);

                    //firewall in case the pattern match count is exceedingly high
                    if (_stopAfterFirstMatch || matchCount++ > MAX_PATTERN_MATCHES)
                    {
                        yield break;
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Returns all boundaries matching the pattern in a text
        /// </summary>
        /// <param name="pattern">Search pattern</param>
        /// <param name="text">Text</param>
        /// <returns>List of boundaries</returns>
        private List <Boundary> MatchPattern(SearchPattern pattern, string text)
        {
            List <Boundary> matchList = new List <Boundary>();

            RegexOptions reopt = RegexOptions.None;

            if (pattern.Modifiers != null && pattern.Modifiers.Length > 0)
            {
                reopt |= (pattern.Modifiers.Contains("i")) ? RegexOptions.IgnoreCase : RegexOptions.None;
                reopt |= (pattern.Modifiers.Contains("m")) ? RegexOptions.Multiline : RegexOptions.None;
            }

            Regex           patRegx = new Regex(pattern.Pattern, reopt);
            MatchCollection matches = patRegx.Matches(text);

            if (matches.Count > 0)
            {
                foreach (Match m in matches)
                {
                    Boundary bound = new Boundary()
                    {
                        Index = m.Index, Length = m.Length
                    };
                    if (ScopeMatch(pattern, bound, text))
                    {
                        matchList.Add(bound);
                    }

                    if (_stopAfterFirstMatch)
                    {
                        break;
                    }
                }
            }

            return(matchList);
        }
예제 #3
0
 /// <summary>
 /// Returns all boundaries matching the pattern
 /// </summary>
 /// <param name="pattern">Search pattern</param>
 /// <returns>List of boundaries</returns>
 public List <Boundary> MatchPattern(SearchPattern pattern)
 {
     return(MatchPattern(pattern, _content));
 }
 /// <summary>
 /// Returns all boundaries matching the pattern
 /// </summary>
 /// <param name="pattern">Search pattern</param>
 /// <returns>List of boundaries</returns>
 public IEnumerable <Boundary> EnumerateMatchingBoundaries(SearchPattern pattern)
 {
     return(EnumerateMatchingBoundaries(pattern, _content));
 }