C# 如何解析C语言中的标记文本#

C# 如何解析C语言中的标记文本#,c#,regex,string,migradoc,C#,Regex,String,Migradoc,我正在尝试使用MigraDoc制作一个简单的文本格式化程序,用于实际排版文本。 我想通过标记文本来指定格式。例如,输入可能如下所示: "The \i{quick} brown fox jumps over the lazy dog^{note}" 这将表示“快速”为斜体,“注释”为上标。 为了进行拆分,我在TextFormatter中制作了一本字典: internal static TextFormatter() { FormatDictionary = new Dic

我正在尝试使用MigraDoc制作一个简单的文本格式化程序,用于实际排版文本。 我想通过标记文本来指定格式。例如,输入可能如下所示:

"The \i{quick} brown fox jumps over the lazy dog^{note}"
这将表示“快速”为斜体,“注释”为上标。 为了进行拆分,我在
TextFormatter
中制作了一本字典:

internal static TextFormatter()
    {
        FormatDictionary = new Dictionary<string, TextFormats>()            
        {
            {@"^", TextFormats.supersript},
            {@"_",TextFormats.subscript},
            {@"\i", TextFormats.italic}
        };
    }
内部静态文本格式化程序()
{
FormatDictionary=新字典()
{
{@“^”,TextFormats.superscript},
{@“"”,TextFormats.subscript},
{@“\i”,TextFormats.italic}
};
}
然后,我希望使用一些正则表达式进行拆分,这些正则表达式查找修饰符字符串并匹配大括号中包含的内容

但由于字符串中可以存在多种格式,我还需要跟踪匹配的正则表达式。例如,获取一个
列表
,(其中
字符串
是封闭的字符串,
文本格式
是对应于适当特殊序列的文本格式值,项目按外观顺序排序),然后我可以根据
文本格式
重复应用格式


谢谢您的建议。

考虑以下代码

string inputMessage=@“棕色狐狸跳过了懒狗^{note}”;

MatchCollection matches=Regex.matches(inputMessage,@)(?我不确定回调是否在Dot Net中可用,但是

如果您有类似于
“棕色狐狸跳过懒狗^{note}”

您只需在找到它们时进行替换。
可以使用回调函数使用正则表达式替换

 #  @"(\\i|_|\^){([^}]*)}"

 ( \\i | _ | \^ )         # (1)
 {
 ( [^}]* )                # (2)
 }
 if (match.Groups[1].sucess) 
   // return "{fmtCode1Start}\4{fmtCode1End}"
 else if (match.Groups[2].sucess) 
   // return "{fmtCode2Start}\4{fmtCode2End}"
 else if (match.Groups[3].sucess) 
   // return "{fmtCode3Start}\4{fmtCode3End}"
然后在回调中检查捕获缓冲区1的格式,替换为
{fmtCodeStart}\2{fmtCodeEnd}


或者你可以用

 #  @"(?:(\\i)|(_)|(\^)){([^}]*)}"

 (?:
      ( \\i )             # (1)
   |  ( _ )               # (2)
   |  ( \^ )              # (3)
 )
 {
 ( [^}]* )                # (4)
 }
然后在回调中

 #  @"(\\i|_|\^){([^}]*)}"

 ( \\i | _ | \^ )         # (1)
 {
 ( [^}]* )                # (2)
 }
 if (match.Groups[1].sucess) 
   // return "{fmtCode1Start}\4{fmtCode1End}"
 else if (match.Groups[2].sucess) 
   // return "{fmtCode2Start}\4{fmtCode2End}"
 else if (match.Groups[3].sucess) 
   // return "{fmtCode3Start}\4{fmtCode3End}"

是否需要支持嵌套格式?例如上标和斜体?还有您尝试过的内容,看起来您已经开始,但实际上您还没有尝试实现它。如何预处理文本并将每个顶级格式序列作为标记提取出来?例如:“the\b{\i{quick}brown fox跳过了lazy dog^{note}”“。在此示例中,您将有两个顶级文本格式标记。然后,您可以使用堆栈将每个标记拆分为一系列复合标记;即:示例中的第一个文本格式元素标记将拆分为堆栈上的两个标记(粗体,然后斜体);第二个将只有一个。然后,您可以从堆栈标记中弹出项,以便按照它们在文本中出现的逻辑嵌套顺序应用格式。@Eluvatar嵌套格式很好,但不需要。您是对的,我没有尝试实现它。我确实花了一些时间仔细考虑,但因为时间太晚了violins开始玩我可以选择写一个问题,或者半心半意地开始一件事,直到下周我才有时间再做。由于加价相当普遍,我想我可能错过了一个简单的基本实现。@codechurn我不认为我能很好地理解你的意思,但听起来很聪明。介意详细说明一下吗n回答?那太棒了。我不知道你能在Lookback-cool中抓到一组人。但是它并没有完全切断它,因为没有捕捉到非格式化的部分。因此我尝试将look(后面|前面)设置为可选:@“(后面|前面)?