为批处理文件语法高亮创建正则表达式模式的问题

Posted

技术标签:

【中文标题】为批处理文件语法高亮创建正则表达式模式的问题【英文标题】:Issue creating regex patterns for batch file syntax highlighting 【发布时间】:2019-03-14 16:32:15 【问题描述】:

我有以下代码来为我正在使用的文本编辑器创建语法突出显示。它使用 FastColoredTextBox 组件。我不能完全正确地高亮批处理文件变量的正则表达式模式。

private void batchSyntaxHighlight(FastColoredTextBox fctb)
    
        fctb.LeftBracket = '(';
        fctb.RightBracket = ')';
        fctb.LeftBracket2 = '\x0';
        fctb.RightBracket2 = '\x0';
        Range e = fctb.Range;
        e.ClearStyle(StyleIndex.All);
        //clear style of changed range
        e.ClearStyle(BlueStyle, BoldStyle, GrayStyle, MagentaStyle, GreenStyleItalic, BrownStyleItalic, YellowStyle);
        //variable highlighting
        e.SetStyle(YellowStyle, "(\".+?\"|\'.+?\')", RegexOptions.Singleline);
        //comment highlighting
        e.SetStyle(GreenStyleItalic, @"(REM.*)");
        //attribute highlighting
        e.SetStyle(GrayStyle, @"^\s*(?<range>\[.+?\])\s*$", RegexOptions.Multiline);
        //class name highlighting
        e.SetStyle(BoldStyle, @"(:.*)");
        //symbol highlighting
        e.SetStyle(MagentaStyle, @"(@|%)", RegexOptions.Singleline);
        e.SetStyle(RedStyle, @"(\*)", RegexOptions.Singleline);
        //keyword highlighting
        e.SetStyle(BlueStyle, @"\b(set|SET|echo|Echo|ECHO|FOR|for|PUSHD|pushd|POPD|popd|pause|PAUSE|exit|Exit|EXIT|cd|CD|If|IF|if|ELSE|Else|else|GOTO|goto|DEL|del)");
        //clear folding markers
        e.ClearFoldingMarkers();
        BATCH_HIGHLIGHTING = true;
    

使用此代码,我似乎无法突出显示两个 '%' 符号之间的字符串而不突出显示几乎整个文件,因为许多行只会包含一个或两个相邻的 '%' 符号。

我也遇到了 '::' cmets 的问题。为了突出显示标签,我创建了正则表达式模式来匹配其中包含“:”的任何行,然后是后面的所有字符。

我希望突出显示正确,以便标签突出显示 BoldStyle 并且 '::' cmets 将突出显示 GreenItalicStyle 而没有任何冲突。我还希望能够突出显示位于两个 '%' 符号之间而不会发生冲突的字符串(例如仅包含一个 '%' 的行)

只有在评论中没有时才应突出显示所有这些内容。

编辑:目前代码只自己突出显示“%”符号,因为我无法让代码在它们之间突出显示而不会导致重大语法问题。

【问题讨论】:

对于 % 问题,是 MagentaStyle 吗?另外,为了澄清一下,如果百分比之间存在某些内容并且两个百分比必须在同一行上,您是否希望这些百分比突出显示? @DougF 是的,这是正确的。 好的,如果是这样,我在regex101.com/r/tdgSAZ/1 做了一个正则表达式,如果你想看看它是否适合你。如果没有,请告诉我出了什么问题,我会再试一次。 @DougF 试过了,它几乎突出显示了整个文件,因为顶部的一行只包含一个'%'。 @ZachPedigo 好的,我想我知道我哪里出错了。这次我在dotnetfiddle.net/AAHh0U 做这个dotnetfiddle,我认为这对你有用。我不得不使用 RegexOptions.Multiline。搏一搏。对所有的来回感到抱歉。 【参考方案1】:

非常感谢 @DougF 帮助我找到这个解决方案。答案是:

@"^:[a-zA-Z]+"

【讨论】:

以上是关于为批处理文件语法高亮创建正则表达式模式的问题的主要内容,如果未能解决你的问题,请参考以下文章

Scintilla.NET 基于正则表达式的语法高亮

批处理正则表达式怎样替换第二个指定字符

正则匹配模式汇总

grep文本处理工具

语法高亮/词法分析算法

Linux相识相知文本处理工具之grepegrepfgrep及正则表达式