我有一个简单的“语言”(类似于模板语言和简单的标记语言,例如 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$ }
首先,我尝试使用两个正则表达式来解决这个问题(对于 { 和 },当然使用这种方法不可能跳过带有or之类的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
正则true
表达式Begin
并且End
不适用于多行。所以它不匹配这个:{ $var$
如果没有右括号,则 span 会占用所有内容,直到文档结束。这就是我添加
.
规则的原因。