diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/RegexSearchStrategy.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/RegexSearchStrategy.cs index a2535ac394..21cd84d755 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/RegexSearchStrategy.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/RegexSearchStrategy.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; +using System.Windows.Documents; using ICSharpCode.AvalonEdit.Document; @@ -14,23 +15,34 @@ namespace ICSharpCode.AvalonEdit.Search class RegexSearchStrategy : ISearchStrategy { readonly Regex searchPattern; + readonly bool matchWholeWords; - public RegexSearchStrategy(Regex searchPattern) + public RegexSearchStrategy(Regex searchPattern, bool matchWholeWords) { if (searchPattern == null) throw new ArgumentNullException("searchPattern"); this.searchPattern = searchPattern; + this.matchWholeWords = matchWholeWords; } public IEnumerable FindAll(ITextSource document, int offset, int length) { int endOffset = offset + length; foreach (Match result in searchPattern.Matches(document.Text)) { - if (offset <= result.Index && endOffset >= (result.Length + result.Index)) - yield return new SearchResult { StartOffset = result.Index, Length = result.Length, Data = result }; + int resultEndOffset = result.Length + result.Index; + if (offset > result.Index || endOffset < resultEndOffset) + continue; + if (matchWholeWords && (!IsWordBorder(document, offset) || !IsWordBorder(document, resultEndOffset))) + continue; + yield return new SearchResult { StartOffset = result.Index, Length = result.Length, Data = result }; } } + static bool IsWordBorder(ITextSource document, int offset) + { + return TextUtilities.GetNextCaretPosition(document, offset - 1, LogicalDirection.Forward, CaretPositioningMode.WordBorder) == offset; + } + public ISearchResult FindNext(ITextSource document, int offset, int length) { return FindAll(document, offset, length).FirstOrDefault(); diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchStrategyFactory.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchStrategyFactory.cs index 25c4661a62..2156ba8e6d 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchStrategyFactory.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Search/SearchStrategyFactory.cs @@ -33,12 +33,9 @@ namespace ICSharpCode.AvalonEdit.Search searchPattern = ConvertWildcardsToRegex(searchPattern); break; } - - if (matchWholeWords) - searchPattern = "\\b" + searchPattern + "\\b"; try { Regex pattern = new Regex(searchPattern, options); - return new RegexSearchStrategy(pattern); + return new RegexSearchStrategy(pattern, matchWholeWords); } catch (ArgumentException ex) { throw new SearchPatternException(ex.Message, ex); }