防止嵌套替换

时间:2017-12-03 00:27:38

标签: c# .net regex

我正在使用正则表达式,我需要从排序的字典中找到匹配项(按长度排序 - 从长到短 - 能够匹配短语),我会迭代。我的解决方案效果很好,但遗憾的是只有特定点。

示例

资料来源:"I do not want to make a big thing of this, because big things are bad."

我遍历字典,假设有一个条目make a big thing of,其中包含overplay, stress, overstress等同义词。

匹配和替换结果如下:

I do not want to {make a big thing of|overplay|stress|overstress} this, because big things are bad.

当我在字典中使用较短的单词时,问题就出现了,让我们说biglarge, huge, massive这样的同义词。

匹配和替换结果看起来像这样,并开始搞乱以前的替换:

I do not want to {make a {big|large|huge|massive} thing of|overplay|stress|overstress} this, because {big|large|huge|massive} things are bad.

对于第二个big,这可能没问题,但是对于嵌套替换,如果通过字典的迭代继续进行,那么整个文本会发生巨大的变化。

我需要什么

为了不弄乱文本,我需要防止嵌套替换。

所以我创建了一个没有“{”或“|”的规则应该出现在单词之前,没有“|”或者在词典中的单词或短语之后的“}”,以检查单词或短语是否已经是{word|phrase|word}结构的一部分。但这与已经替换的短语中的单词不匹配,这些单词不应该被替换(再次)。

到目前为止我的代码

        string resultString = inText;
        string synonyms = "";
        string meaning = "";

        foreach (var item in Dictionary.WordList)
        {
            meaning = item.Key.Replace("|", "");

            try
            {
                if (meaning.Length > 1)
                {

                    var regex = new Regex(@"(?![{|])\b" + meaning + @"\b(?![\w|}])");
                    var matches = regex.Matches(resultString);

                    if (matches.Count == 0)
                        continue;

                    // in case the replacement is of a different length we replace from
                    // from back to front to keep the match indices correct
                    foreach (var match in matches.Cast<Match>().Reverse())
                    {
                        // use case specific reformatting
                        synonyms = item.Value.Substring(1, item.Value.Length - 2);
                        synonyms = synonyms.Replace("||", "|");

                        resultString = resultString.Replace(match.Index, match.Length, "{" + meaning + "|" + synonyms + "}");
                    }


                }                
            }
            catch (Exception ex)
            {

            }

0 个答案:

没有答案