【发布时间】:2014-04-20 18:23:20
【问题描述】:
我有一个简单的“语言”(类似于模板语言和简单的标记语言,例如 BBcode — 基本上它只是带有一些变量、标签和类似功能的普通文本),我想强调它的语法。
这是我坚持的事情。
有变量,它们用$符号($var1$)括起来。我用这条规则突出显示它们:
<RuleSet name="VariableSet">
<Rule color="Variable">
\$\S+?\$
</Rule>
</RuleSet>
变量周围的某些区域可以用 { } 字符包围。
换句话说:一些变量可以有它的“区域”,它从变量之前的第一个{开始,到变量之后的第一个}结束。多个变量不能在一个区域中,因此在像{ $var1$ $var2$ } 这样没有任何区域的情况下,{ } 被视为普通字符并被忽略。它不像 C 风格语言中的函数和局部范围。
这是一个例子:
[b]lorem ipsum[/b] $var0$ dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua.
{ // <— not nighlighted
{ // <— highlighted
ut enim ad minim veniam, quis nostrud
$var1$
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
} // <— highlighted
} // <— not nighlighted
// all brackets below also should be not highlighted
duis aute { $50, 25$} irure { dolor } excepteur $var2$ sint occaecat cupidatat non
proident, sunt in culpa qui mollit anim id { est $var2$ laborum.
{ $var3$ $var4$ }
首先我尝试使用两个 Rule 正则表达式来解决这个问题(对于 { 和 },当然使用这种方法不可能跳过像 { $var$ 或 $var$ } 这样的未闭合括号的情况,但这不是一个大问题) .但是我发现Rule 只能在一行内工作。
然后我像这样尝试Span:
<Span color="VariableAreaDelimiter" multiline="true">
<Begin>
\{(?!\{.*?\$\S+?\$)(?=.*?\$\S+?\$)
</Begin>
<End>
\}
</End>
<RuleSet>
<Import ruleSet="VariableSet"/>
<Rule foreground="Black" fontWeight="normal">
.
</Rule>
</RuleSet>
</Span>
一些问题:
-
虽然
multiline和Begin和End中的true正则表达式不适用于多行。所以它不匹配这个:{ $var$ 如果没有右括号,则 span 将获取所有内容,直到文档结束。这就是我添加
.规则的原因。
【问题讨论】:
-
您混淆了多行选项和单行选项。
-
@CasimiretHippolyte 你能解释一下你的意思吗?
标签: c# regex syntax-highlighting avalonedit