Exemple #1
0
 private void FindAll(string text, int index, TrieNode3 ptr, List <WordsSearchResult> list)
 {
     for (int i = index; i < text.Length; i++)
     {
         var       t = text[i];
         TrieNode3 tn;
         if (ptr.TryGetValue(t, out tn) == false)
         {
             if (ptr.HasWildcard)
             {
                 FindAll(text, i + 1, ptr.WildcardNode, list);
             }
             return;
         }
         if (tn.End)
         {
             foreach (var r in tn.Results)
             {
                 var length = _keywordLength[r];
                 var start  = i - length + 1;
                 if (start >= 0)
                 {
                     var kIndex       = _keywordIndex[r];
                     var matchKeyword = _matchKeywords[kIndex];
                     var keyword      = text.Substring(start, length);
                     var result       = new WordsSearchResult(keyword, start, i, kIndex, matchKeyword);
                     list.Add(result);
                 }
             }
         }
         ptr = tn;
     }
 }
Exemple #2
0
        /// <summary>
        /// 在文本中查找所有的关键字
        /// </summary>
        /// <param name="text">文本</param>
        /// <returns></returns>
        public List <WordsSearchResult> FindAll(string text)
        {
            List <WordsSearchResult> result = new List <WordsSearchResult>();
            var p = 0;

            for (int i = 0; i < text.Length; i++)
            {
                var t = _dict[text[i]];
                if (t == 0)
                {
                    p = 0;
                    continue;
                }
                int next;
                if (p == 0 || t < _min[p] || t > _max[p] || _nextIndex[p].TryGetValue(t, out next) == false)
                {
                    next = _first[t];
                }
                if (next != 0)
                {
                    for (int j = _end[next]; j < _end[next + 1]; j++)
                    {
                        var index = _resultIndex[j];
                        var key   = _keywords[index];
                        var r     = new WordsSearchResult(key, i + 1 - key.Length, i, index);
                        result.Add(r);
                    }
                }
                p = next;
            }
            return(result);
        }
Exemple #3
0
        /// <summary>
        /// 在文本中查找所有的关键字
        /// </summary>
        /// <param name="text">文本</param>
        /// <returns></returns>
        public List <WordsSearchResult> FindAll(string text)
        {
            TrieNode3 ptr = null;
            List <WordsSearchResult> list = new List <WordsSearchResult>();

            for (int i = 0; i < text.Length; i++)
            {
                var       t = text[i];
                TrieNode3 tn;
                if (ptr == null)
                {
                    tn = _first[t];
                }
                else
                {
                    if (ptr.TryGetValue(t, out tn) == false)
                    {
                        if (ptr.HasWildcard)
                        {
                            FindAll(text, i + 1, ptr.WildcardNode, list);
                        }
                        tn = _first[t];
                    }
                }
                if (tn != null)
                {
                    if (tn.End)
                    {
                        foreach (var r in tn.Results)
                        {
                            var length = _keywordLength[r];
                            var start  = i - length + 1;
                            if (start >= 0)
                            {
                                var kIndex       = _keywordIndex[r];
                                var matchKeyword = _matchKeywords[kIndex];
                                var keyword      = text.Substring(start, length);
                                var result       = new WordsSearchResult(keyword, start, i, kIndex, matchKeyword);
                                list.Add(result);
                            }
                        }
                    }
                }
                ptr = tn;
            }
            return(list);
        }
        /// <summary>
        /// 在文本中查找所有的关键字
        /// </summary>
        /// <param name="text">文本</param>
        /// <returns></returns>
        public unsafe List <WordsSearchResult> FindAll(string text)
        {
            List <WordsSearchResult> root = new List <WordsSearchResult>();
            var length = text.Length;

            fixed(int *_pnext = &_next[0])
            fixed(int *_pcheck = &_check[0])
            fixed(int *_pkey   = &_key[0])
            fixed(int *_pdict  = &_dict[0])
            fixed(char *_ptext = text)
            {
                var p = 0;

                for (int i = 0; i < length; i++)
                {
                    var t = *(_pdict + (int)*(_ptext + i));
                    if (t == 0)
                    {
                        p = 0;
                        continue;
                    }
                    var  next = *(_pnext + p) + t;
                    bool find = *(_pkey + next) == t;
                    if (find == false && p != 0)
                    {
                        p    = 0;
                        next = *_pnext + t;
                        find = *(_pkey + next) == t;
                    }
                    if (find)
                    {
                        var index = *(_pcheck + next);
                        if (index > 0)
                        {
                            foreach (var item in _guides[index])
                            {
                                var key = _keywords[item];
                                var r   = new WordsSearchResult(key, i + 1 - key.Length, i, item);
                                root.Add(r);
                            }
                        }
                        p = next;
                    }
                }
            }
            return(root);
        }
        /// <summary>
        /// 在文本中查找所有的关键字
        /// </summary>
        /// <param name="text">文本</param>
        /// <returns></returns>
        public List <WordsSearchResult> FindAll(string text)
        {
            List <WordsSearchResult> result = new List <WordsSearchResult>();
            var p = 0;

            for (int i = 0; i < text.Length; i++)
            {
                var t1 = text[i];
                var t  = _dict[t1];
                if (t == 0)
                {
                    p = 0;
                    continue;
                }
                int next;
                if (p == 0 || _nextIndex[p].TryGetValue(t, out next) == false)
                {
                    if (_wildcard[p] > 0)
                    {
                        FindAll(text, i + 1, _wildcard[p], result);
                    }
                    next = _firstIndex[t];
                }
                if (next != 0)
                {
                    for (int j = _end[next]; j < _end[next + 1]; j++)
                    {
                        var idx    = _resultIndex[j];
                        var length = _keywordLength[idx];
                        var start  = i - length + 1;
                        if (start >= 0)
                        {
                            var kIndex       = _keywordIndex[idx];
                            var matchKeyword = _matchKeywords[kIndex];
                            var keyword      = text.Substring(start, length);
                            var r            = new WordsSearchResult(keyword, start, i, kIndex, matchKeyword);
                            result.Add(r);
                        }
                    }
                }
                p = next;
            }
            return(result);
        }
Exemple #6
0
        /// <summary>
        /// 在文本中查找所有的关键字
        /// </summary>
        /// <param name="text">文本</param>
        /// <returns></returns>
        public List <WordsSearchResult> FindAll(string text)
        {
            List <WordsSearchResult> root = new List <WordsSearchResult>();
            var p = 0;

            for (int i = 0; i < text.Length; i++)
            {
                var t = (char)_dict[text[i]];
                if (t == 0)
                {
                    p = 0;
                    continue;
                }
                var  next = _next[p] + t;
                bool find = _key[next] == t;
                if (find == false && p != 0)
                {
                    p    = 0;
                    next = _next[0] + t;
                    find = _key[next] == t;
                }
                if (find)
                {
                    var index = _check[next];
                    if (index > 0)
                    {
                        foreach (var item in _guides[index])
                        {
                            var key = _keywords[item];
                            var r   = new WordsSearchResult(key, i + 1 - key.Length, i, item);
                            root.Add(r);
                        }
                    }
                    p = next;
                }
            }
            return(root);
        }
 private void FindAll(string text, int index, int p, List <WordsSearchResult> result)
 {
     for (int i = index; i < text.Length; i++)
     {
         var t1 = text[i];
         var t  = _dict[t1];
         if (t == 0)
         {
             return;
         }
         int next;
         if (p == 0 || _nextIndex[p].TryGetValue(t, out next) == false)
         {
             if (_wildcard[p] > 0)
             {
                 FindAll(text, i + 1, _wildcard[p], result);
             }
             return;
         }
         for (int j = _end[next]; j < _end[next + 1]; j++)
         {
             var idx    = _resultIndex[j];
             var length = _keywordLength[idx];
             var start  = i - length + 1;
             if (start >= 0)
             {
                 var kIndex       = _keywordIndex[idx];
                 var matchKeyword = _matchKeywords[kIndex];
                 var keyword      = text.Substring(start, length);
                 var r            = new WordsSearchResult(keyword, start, i, kIndex, matchKeyword);
                 result.Add(r);
             }
         }
         p = next;
     }
 }