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

时间:2013-11-18 16:55:36

标签: c# regex string migradoc

我正在尝试使用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}
        };
    }

然后我希望使用一些正则表达式来查找修饰符字符串并匹配大括号中包含的内容。

但由于字符串中可以存在多种格式,因此我还需要跟踪匹配的正则表达式。例如。得到一个List<string, TextFormats>,(其中string是附加的字符串,TextFormats是对应于相应特殊序列的TextFormats值,项目按照出现的顺序排序),然后我可以迭代基于TextFormats

应用格式

感谢您提出任何建议。

2 个答案:

答案 0 :(得分:1)

考虑以下代码......

string inputMessage = @"The \i{quick} brown fox jumps over the lazy dog^{note}";
MatchCollection matches = Regex.Matches(inputMessage, @"(?<=(\\i|_|\^)\{)\w*(?=\})");

foreach (Match match in matches)
{
    string textformat = match.Groups[1].Value;
    string enclosedstring = match.Value;
    // Add to Dictionary<string, TextFormats> 
}

祝你好运!

答案 1 :(得分:0)

我不确定Dot-Net中是否有回调,但是

如果您有"The \i{quick} brown fox jumps over the lazy dog^{note}"
之类的字符串 你想在找到它们时做替换 可以使用回调替换正则表达式

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

 ( \\i | _ | \^ )         # (1)
 {
 ( [^}]* )                # (2)
 }

然后在回调中检查捕获缓冲区1的格式,替换为{fmtCodeStart}\2{fmtCodeEnd}


或者您可以使用

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

 (?:
      ( \\i )             # (1)
   |  ( _ )               # (2)
   |  ( \^ )              # (3)
 )
 {
 ( [^}]* )                # (4)
 }

然后在回调中

 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}"