C# 如何解析C语言中的标记文本#
我正在尝试使用MigraDoc制作一个简单的文本格式化程序,用于实际排版文本。 我想通过标记文本来指定格式。例如,输入可能如下所示: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
"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(后面|前面)设置为可选:@“(后面|前面)?