Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找可能包含RTF标记的特定单词_C#_Regex_Rtf - Fatal编程技术网

C# 查找可能包含RTF标记的特定单词

C# 查找可能包含RTF标记的特定单词,c#,regex,rtf,C#,Regex,Rtf,我目前正在编写一个程序,通过在富格文本文档中放置RTF标记来格式化某些单词。 由于程序允许使用可能重叠的其他格式规则(即将短语“please help me”全部涂成黄色,将“please”涂成蓝色),因此程序很难找到已按以前的规则(即上一示例中的“please help me”)格式化的匹配项“\cf1请\cf0帮助我”,这与其他规则不匹配。 我一直通过使用正则表达式来解决这个问题,并在短语中的每个字符后放置一个与任何RTF标记匹配的表达式(因为规则是由用户定义的,我不知道具体的重叠点

我目前正在编写一个程序,通过在富格文本文档中放置RTF标记来格式化某些单词。

由于程序允许使用可能重叠的其他格式规则(即将短语“please help me”全部涂成黄色,将“please”涂成蓝色),因此程序很难找到已按以前的规则(即上一示例中的“please help me”)格式化的匹配项“\cf1\cf0帮助我”,这与其他规则不匹配。

我一直通过使用正则表达式来解决这个问题,并在短语中的每个字符后放置一个与任何RTF标记匹配的表达式(因为规则是由用户定义的,我不知道具体的重叠点),如下所示:

上面序列中的“(?:\\[^]*)*”表达式会查找前面的字符,而不管后面有什么标记,但是对每个规则执行此操作会大大降低代码的速度,并且需要为每个规则生成正则表达式;根据规则,这可能无法按预期工作。

呃,对不起,我现在要说的是文字墙。有人知道一种更有效的方法来查找在未知点上有RTF标记的单词吗?

一种可能是永远不允许类似标记重叠-如果您需要开始用红色格式化文本,但它已经用蓝色格式化,请在启动红色标记之前关闭蓝色标记。否则,我会认为格式化规则可能会变得非常模糊

编辑


如果您确实需要重叠,则创建一个格式堆栈。如上文所述结束旧标记,但将其保存到堆栈中。如果旧格式未关闭(且仍在堆栈中),则启动新标记,并在完成新标记时启动新标记重新开始旧的格式设置。每当您关闭标记时,都会将其从堆栈中删除。

Hmm,您的堆栈想法听起来很完美。谢谢!
line = Regex.Replace(line, @"\bP(?:\\[^ ]* )*l(?:\\[^ ]* )*e(?:\\[^ ]* )*a(?:\\[^ ]*   )*s(?:\\[^ ]* )*e(?:\\[^ ]* )*", Evaluator);