C# 查找可能包含RTF标记的特定单词
我目前正在编写一个程序,通过在富格文本文档中放置RTF标记来格式化某些单词。 由于程序允许使用可能重叠的其他格式规则(即将短语“please help me”全部涂成黄色,将“please”涂成蓝色),因此程序很难找到已按以前的规则(即上一示例中的“please help me”)格式化的匹配项“\cf1请\cf0帮助我”,这与其他规则不匹配。 我一直通过使用正则表达式来解决这个问题,并在短语中的每个字符后放置一个与任何RTF标记匹配的表达式(因为规则是由用户定义的,我不知道具体的重叠点),如下所示: 上面序列中的“(?:\\[^]*)*”表达式会查找前面的字符,而不管后面有什么标记,但是对每个规则执行此操作会大大降低代码的速度,并且需要为每个规则生成正则表达式;根据规则,这可能无法按预期工作。 呃,对不起,我现在要说的是文字墙。有人知道一种更有效的方法来查找在未知点上有RTF标记的单词吗?C# 查找可能包含RTF标记的特定单词,c#,regex,rtf,C#,Regex,Rtf,我目前正在编写一个程序,通过在富格文本文档中放置RTF标记来格式化某些单词。 由于程序允许使用可能重叠的其他格式规则(即将短语“please help me”全部涂成黄色,将“please”涂成蓝色),因此程序很难找到已按以前的规则(即上一示例中的“please help me”)格式化的匹配项“\cf1请\cf0帮助我”,这与其他规则不匹配。 我一直通过使用正则表达式来解决这个问题,并在短语中的每个字符后放置一个与任何RTF标记匹配的表达式(因为规则是由用户定义的,我不知道具体的重叠点
一种可能是永远不允许类似标记重叠-如果您需要开始用红色格式化文本,但它已经用蓝色格式化,请在启动红色标记之前关闭蓝色标记。否则,我会认为格式化规则可能会变得非常模糊 编辑
如果您确实需要重叠,则创建一个格式堆栈。如上文所述结束旧标记,但将其保存到堆栈中。如果旧格式未关闭(且仍在堆栈中),则启动新标记,并在完成新标记时启动新标记重新开始旧的格式设置。每当您关闭标记时,都会将其从堆栈中删除。Hmm,您的堆栈想法听起来很完美。谢谢!
line = Regex.Replace(line, @"\bP(?:\\[^ ]* )*l(?:\\[^ ]* )*e(?:\\[^ ]* )*a(?:\\[^ ]* )*s(?:\\[^ ]* )*e(?:\\[^ ]* )*", Evaluator);