我正在做一个公平的(至少我是这么认为的)操作。我有一个包含宏的 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,它将被忽略并跳过。
将不断更新这是多么成功。