我目前正在编写一个程序,通过在它们周围放置RTF标记来格式化Rich Text文档中的某些单词。
由于该程序允许可以重叠的其他格式规则(即着色短语“请帮助我”所有黄色和着色“请”蓝色),该程序具有难以找到已经被先前规则格式化的匹配(即“请帮助我”,从上一个示例变为“ \ cf1 请 \ cf0 帮我“,这与其他规则不符。
我通过使用正则表达式并在短语中的每个字符之后放置一个匹配任何RTF标记的表达式来解决这个问题(因为规则是由用户定义的,我不知道具体的重叠点),像这样:
line = Regex.Replace(line, @"\bP(?:\\[^ ]* )*l(?:\\[^ ]* )*e(?:\\[^ ]* )*a(?:\\[^ ]* )*s(?:\\[^ ]* )*e(?:\\[^ ]* )*", Evaluator);
上面序列中的'(?:\\ [^] *)*'表达式会查找前面的字符而不管其后面的任何标记,但是对每个规则执行此操作都会大大减慢代码速度并要求我生成正则表达式每一个;根据规则,可能无法按预期工作。
呃,对不起文字的墙,我现在就明白了。有没有人知道一种更有效的方法来找到一个在其中有未知点的RTF标签的单词?
答案 0 :(得分:0)
一种可能性是永远不允许类似标签重叠 - 如果您需要开始将文本格式化为红色但已经格式化为蓝色,请在启动红色标签之前关闭蓝色标签。否则我会想到格式化规则可能会变得很模糊。
修改的
如果您确实需要重叠,请创建格式的堆栈。如上所述结束旧标记,但将其保存到堆栈中。启动新标记,当新标记完成后,如果旧格式未关闭(并且仍在堆栈中),请再次启动旧格式。每当您关闭标签时,都会将其从堆栈中移除。