我正在为Script on Roll20: Scriptcards的Sublime for Macros制作一个自定义的语法高亮器,并且我在获取正则表达式方面取得了一些进展,但我有一个障碍:
我似乎无法获得与输出行上的所有输出文本匹配的表达式。
在Scriptcards中,以--+TEXT|
开头的一行将生成一个输出,其中包含该序列之后的任何内容。因此,一个完整的行可能看起来像这样:
--+Move|Go [$Num] spaces [&Direction]
它将输出一行标题为Move
的行,并显示Go X spaces (up/down/left/right)
,因为[$Num]
和[&Direction]
分别表示数字和字符串变量。
我想对Move
、Go_
和_spaces_
(其中_
表示空白)进行相同的着色,尽管实际上,由于这是一个输出行,因此显示的变量数量和位置可能会有很大的变化。
因此,简而言之,我试图匹配以--+TEXT|
开头的行中的所有文本,这些文本没有出现在[]
之间,并且不是起始序列的--+
和|
。
我试过一些表达方式:
这一个获取所有不在[]
内的文本:
\[^\]]+(?![^\[]*\])\m
它获取[
之前的起始序列之后的所有文本
\(?<=--\+.*?\|)[^\]]+(?![^\[]*\])\m
这一个获取起始序列中的文本:
\(?<=--\+).*?(?=\|)\m
我的问题是将所有这些部分连接在一起,以我想要的方式工作。我开始认为Regex的工作方式是不可能的,但我想我应该在这里尝试一下,看看更有经验的人是否会有任何见解。
2条答案
按热度按时间uxhixvfz1#
我不太了解Sublime的语法高亮,但假设它使用现代JavaScript,你可能可以使用这样的表达式:
这将搜索出现在以
--+
开头且前面没有[*
的行中的单词(其中 * 是任何一个字符)当在JavaScript正则表达式引擎中运行时,它会产生以下结果:
yquaqz182#
这里的解决方案应该工作,即使没有假设方括号包含单个单词:
这里:
(?<=^--\+)\w+?(?=\|)
匹配--+
和|
之间的字,在行的开头,(?<=^--\+.+\|.*)(?<=^([^\]\[\n]*\[[^\]\[\n]*])*[^\]\[\n]*)[^\]\[\n]++
匹配行中以--+
开头的方括号外的所有单词:(?<=^--\+.+\|.*)
检查其中字从--+word|
开始匹配行,(?<=^([^\]\[\n]*\[[^\]\[\n]*])*[^\]\[\n]*)
检查匹配单词的左边是否有所有的左方括号和右方括号。这样我们就可以确定我们的单词在方括号之外。演示here。