我正在为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的工作方式是不可能的,但我想我应该在这里尝试一下,看看更有经验的人是否会有任何见解。
我不太了解Sublime语法高亮,但假设它使用现代JavaScript,你可能可以使用这样的表达式:
/(?<=^--+.*?)s*(?<![.)bw+s*/g
搜索以--+
开头且不以[*
开头的行中出现的单词(其中*是任意一个字符)
在JavaScript正则表达式引擎中运行时,它会生成以下内容:
Array.from(
"--+Move|Go [$Num] spaces [&Direction]".matchAll(
/(?<=^--+.*?)s*(?<![.)bw+s*/g
)
)
// [["Move"],["Go "],[" spaces "]]
即使不假设方括号中包含单个单词,也应该可以工作的解决方案:
(?<=^--+)w+?(?=|)|(?<=^--+.+|.*)(?<=^([^][n]*[[^][n]*])*[^][]*)[^][n]+
:
(?<=^--+)w+?(?=|)
匹配--+
和|
之间的单词,在行开头,(?<=^--+.+|.*)(?<=^([^][n]*[[^][n]*])*[^][n]*)[^][n]+
匹配所有以--+
开头的方括号外的行字:(?<=^--+.+|.*)
检查与--+word|
开头的单词匹配的行,(?<=^([^][n]*[[^][n]*])*[^][n]*)
检查匹配字的左边所有的左方括号与右方括号配对。这样我们就可以确保我们的词在括号之外。
演示。