我正在使用正则表达式,我需要从排序的字典中找到匹配项(按长度排序 - 从长到短 - 能够匹配短语),我会迭代。我的解决方案效果很好,但遗憾的是只有特定点。
示例
资料来源:"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.
当我在字典中使用较短的单词时,问题就出现了,让我们说big
和large, 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)
{
}