private string BuildRegexForExactMatch(CustomEntitySelection selection)
        {
            string        word        = selection.Text.Trim();
            StringBuilder escapedWord = new StringBuilder(@"(?=(");

            if (!word.First().IsDelineating())
            {
                escapedWord.Append(@"\b");
            }

            for (int currWordCharIndex = 0; currWordCharIndex < word.Length; currWordCharIndex++)
            {
                if (word[currWordCharIndex].IsDelineating())
                {
                    escapedWord.Append(@"[\s\p{P}]");
                }
                else
                {
                    escapedWord.Append(word[currWordCharIndex]);
                }
            }
            if (!word.Last().IsDelineating())
            {
                escapedWord.Append(@"\b");
            }

            escapedWord.Append("))");
            string pattern = (selection.CaseSensitive) ? @"(?x)" + escapedWord : @"(?ix)" + escapedWord;

            return(pattern);
        }
        public CustomEntityLookupImplementation(CustomEntitiesDefinition entityDefinitions)
        {
            _targetEntities = entityDefinitions;
            _selections     = new HashSet <CustomEntitySelection>();

            foreach (var tce in _targetEntities.TargetCustomEntities)
            {
                var entitySelection = new CustomEntitySelection(tce);
                _selections.Add(entitySelection);

                if (tce.Aliases?.Any() == true)
                {
                    foreach (var alias in tce.Aliases)
                    {
                        var aliasSelection = new CustomEntitySelection(tce, alias);

                        if (!_selections.Contains(aliasSelection))
                        {
                            _selections.Add(aliasSelection);
                        }
                    }
                }
            }
        }