Regex:如何匹配所有不在[]内的文本,但仅在以序列开头的行上?



我正在为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]*)检查匹配字的左边所有的左方括号与右方括号配对。这样我们就可以确保我们的词在括号之外。

演示。

相关内容

  • 没有找到相关文章

最新更新