コード例 #1
0
ファイル: FindReplace.cs プロジェクト: JanChou/monodevelop
        public IEnumerable <SearchResult> Search(FileProvider provider, string content, string pattern, string replacePattern, FilterOptions filter)
        {
            if (string.IsNullOrEmpty(content))
            {
                yield break;
            }
            int idx        = provider.SelectionStartPosition < 0 ? 0 : Math.Max(0, provider.SelectionStartPosition);
            int delta      = 0;
            var comparison = filter.CaseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase;
            int end        = provider.SelectionEndPosition < 0 ? content.Length : Math.Min(content.Length, provider.SelectionEndPosition);

            while ((idx = content.IndexOf(pattern, idx, end - idx, comparison)) >= 0)
            {
                if (!filter.WholeWordsOnly || FilterOptions.IsWholeWordAt(content, idx, pattern.Length))
                {
                    if (replacePattern != null)
                    {
                        provider.Replace(idx + delta, pattern.Length, replacePattern);
                        yield return(new SearchResult(provider, idx + delta, replacePattern.Length));

                        delta += replacePattern.Length - pattern.Length;
                    }
                    else
                    {
                        yield return(new SearchResult(provider, idx, pattern.Length));
                    }
                }
                idx += pattern.Length;
            }
        }
コード例 #2
0
        IEnumerable <SearchResult> RegexSearch(ProgressMonitor monitor, FileProvider provider, TextReader reader, string replacePattern, FilterOptions filter)
        {
            string content = reader.ReadToEnd();
            var    results = new List <SearchResult> ();

            if (replacePattern == null)
            {
                foreach (Match match in regex.Matches(content))
                {
                    if (monitor.CancellationToken.IsCancellationRequested)
                    {
                        break;
                    }
                    if (provider.SelectionStartPosition > -1 && match.Index < provider.SelectionStartPosition)
                    {
                        continue;
                    }
                    if (provider.SelectionEndPosition > -1 && match.Index + match.Length > provider.SelectionEndPosition)
                    {
                        continue;
                    }
                    if (!filter.WholeWordsOnly || FilterOptions.IsWholeWordAt(content, match.Index, match.Length))
                    {
                        results.Add(new SearchResult(provider, match.Index, match.Length));
                    }
                }
            }
            else
            {
                var matches = new List <Match> ();
                foreach (Match match in regex.Matches(content))
                {
                    if (provider.SelectionStartPosition > -1 && match.Index < provider.SelectionStartPosition)
                    {
                        continue;
                    }
                    if (provider.SelectionEndPosition > -1 && match.Index + match.Length > provider.SelectionEndPosition)
                    {
                        continue;
                    }
                    matches.Add(match);
                }
                provider.BeginReplace(content);
                int delta = 0;
                for (int i = 0; !monitor.CancellationToken.IsCancellationRequested && i < matches.Count; i++)
                {
                    Match match = matches[i];
                    if (!filter.WholeWordsOnly || FilterOptions.IsWholeWordAt(content, match.Index, match.Length))
                    {
                        string replacement = match.Result(replacePattern);
                        results.Add(new SearchResult(provider, match.Index + delta, replacement.Length));
                        provider.Replace(match.Index + delta, match.Length, replacement);
                        delta += replacement.Length - match.Length;
                    }
                }
                provider.EndReplace();
            }
            return(results);
        }
コード例 #3
0
        public IEnumerable <SearchResult> Search(FileProvider provider, string content, string pattern, string replacePattern, FilterOptions filter)
        {
            if (!filter.CaseSensitive)
            {
                pattern = pattern.ToUpper();
                content = content.ToUpper();
            }

            int plen = pattern.Length - 1;
            int delta = 0;
            int i = 0, end = content.Length - pattern.Length;

            if (provider.SelectionStartPosition > -1)
            {
                i = provider.SelectionStartPosition;
            }
            if (provider.SelectionEndPosition > -1)
            {
                end = provider.SelectionEndPosition - pattern.Length;
            }
            while (i <= end)
            {
                int j = plen;
                while (j >= 0 && pattern[j] == content[i + j])
                {
                    j--;
                }

                if (j < 0)
                {
                    int idx = i;
                    if (!filter.WholeWordsOnly || FilterOptions.IsWholeWordAt(content, idx, pattern.Length))
                    {
                        if (replacePattern != null)
                        {
                            yield return(new SearchResult(provider, idx + delta, replacePattern.Length));

                            provider.Replace(idx + delta, pattern.Length, replacePattern);
                            delta += replacePattern.Length - pattern.Length;
                        }
                        else
                        {
                            yield return(new SearchResult(provider, idx, pattern.Length));
                        }
                    }
                    i += next[0];
                }
                else if (j + 1 < next.Length && j + i < content.Length && content[j + i] < occ.Length)
                {
                    i += System.Math.Max(next[j + 1], j - occ[(int)content[i + j]]);
                }
                else
                {
                    i += next[0];
                }
            }
        }