0

我正在做一个公平的(至少我是这么认为的)操作。我有一个包含宏的 RTF 文件。

我编写了 ac# 控制台应用程序,在其中我使用 System.Windows.Forms.RichTextBox 组件。

精简版:

RichTextBox rtb=new RichTextBox();
rtb.LoadFile(input,RichTextBoxStreamType.RichText);
foreach(var macroPair in dictionary)
{
   while (rtb.Find(macroPair.Key) > -1)
   {
      rtb.Select(rtb.Find(macroPair.Key), macroPair.Key.Length);
      rtb.SelectedText = macroPair.Value;
   }
}
rtb.SaveFile(outputRichTextBoxStreamType.RichText);

但是,这会丢失很多格式(颜色、表格、新行等,甚至是一些替换宏):(

替代方法是直接在 rtb.Rtf 上使用替换,但是在没有 RichTextbox 的情况下直接替换文件本身时问题是相同的:RTF 不必不间断地保存文本,即(找不到示例,可能无效:Macro\f252Key . 当您打开 RTF 时,它显示 MacroKey ok,但我也无法让它以这种方式保存 :(

感谢您的任何见解

例子:

这是来自 RTF 的复制粘贴:

Contract No:  \tab %}{{\*\bkmkstart __DdeLink__5913_841230768}\dbch\af3\rtlch \ltrch\loch\lang1033
DEFAULT.}{{\*\bkmkend __DdeLink__5913_841230768}\dbch\af3\rtlch \ltrch\loch\lang1033
CONTRACT_REALID%}

如您所见,%DEFAULT。和 CONTRACT_REALID% 由于某种原因被 rtf 格式分隔(我在 RTF 编辑器中看不到任何东西),所以直接简单的字符串替换在这里不起作用

解决方案

所以我之前发布的解决方案使用正则表达式替换,没有成功......但最终它仍然是正则表达式,但我没有在 RTF 中搜索一个 concreate 宏,而是以相反的方式进行:

首先,我使用以下 RegEx 匹配 RTF 中的所有宏:

string sideregexp = @"[\{\}\\a-zA-Z0-9_*:\s ]+";
MatchCollection mc = Regex.Matches(input, "%" + sideregexp + @"\." + sideregexp + "%", RegexOptions.Singleline);

这会返回我应该/可能是宏的所有内容

通常它会返回如下内容:

%}{\rtlch\fcs1 \af1 \ltrch\fcs0 \fs20\insrsid13847909 \hich\af1\dbch\af31505\loch\f1 MACROSET.MACRO}{\rtlch\fcs1 \af1 \ltrch\fcs0 \fs20\lang1036\langfe1033 \langnp1036\insrsid13847909 \hich\af1\dbch\af31505\loch\f1 %

所以我使用以下正则表达式对其进行消毒:

Regex.Replace(Regex.Replace(mc[index].Value, @"([\\}{]|(__))+[a-zA-Z_\\*0-9\n}{\r]+[ \n\r]", ""), "[\n\r ]", "")

之后,我检查并为从数据库中选择的每个宏进行“桥接测试”(不确定使用什么更好的词)

所以如果我在 rtf 中有这个字符串:

%}{\rtlch\fcs1 \af1 \ltrch\fcs0 \fs20\insrsid13847909 \hich\af1\dbch\af31505\loch\f1 MACROSET.MACRO}{\rtlch\fcs1 \af1 \ltrch\fcs0 \fs20\lang1036\langfe1033 \langnp1036\insrsid13847909 \hich\af1\dbch\af31505\loch\f1 %

其中 sanitezed 等于:

%宏设置.宏%

我有一个 KeyValuePair 像:

%MACROSET.MACRO% = SomeValue

我做了一些魔术,得到了一个 KeyValuepairs 字典,例如:

%}{\rtlch\fcs1 \af1 \ltrch\fcs0 \fs20\insrsid13847909 \hich\af1\dbch\af31505\loch\f1 MACROSET.MACRO}{\rtlch\fcs1 \af1 \ltrch\fcs0 \fs20\lang1036\langfe1033 \langnp1036\insrsid13847909 \hich\af1\dbch\af31505\loch\f1 % = SomeValue

然后我替换那些。如果我没有来自数据库的宏 KeyValuePAir,它将被忽略并跳过。

将不断更新这是多么成功。

4

1 回答 1

0

RTF 格式是基于纯文本的。无需在 RichTextBox 中加载它:您应该能够将其加载到例如 StringBuilder 中,然后搜索和替换您的标签。只是不要忘记转义您要插入的值:{, },\应该变成\{,\}\\, 并且代码 >=128 的任何字符都应该变成\u####?#### 是十进制 UTF-16 代码单元号的地方。

或者,如果您想要更可靠的解决方案(例如,我的方法将失败的一个用例 - 如果格式在单个宏键内发生更改),您可以使用这个 3-rd 方组件

于 2013-11-04T18:21:52.173 回答