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; } }
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); }
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]; } } }