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

mbzjlibv  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(103)

我正在为Script on Roll20: Scriptcards的Sublime for Macros制作一个自定义的语法高亮器,并且我在获取正则表达式方面取得了一些进展,但我有一个障碍:
我似乎无法获得与输出行上的所有输出文本匹配的表达式。
在Scriptcards中,以--+TEXT|开头的一行将生成一个输出,其中包含该序列之后的任何内容。因此,一个完整的行可能看起来像这样:

--+Move|Go [$Num] spaces [&Direction]

它将输出一行标题为Move的行,并显示Go X spaces (up/down/left/right),因为[$Num][&Direction]分别表示数字和字符串变量。
我想对MoveGo__spaces_(其中_表示空白)进行相同的着色,尽管实际上,由于这是一个输出行,因此显示的变量数量和位置可能会有很大的变化。
因此,简而言之,我试图匹配以--+TEXT|开头的行中的所有文本,这些文本没有出现在[]之间,并且不是起始序列的--+|
我试过一些表达方式:
这一个获取所有不在[]内的文本:

\[^\]]+(?![^\[]*\])\m

它获取[之前的起始序列之后的所有文本

\(?<=--\+.*?\|)[^\]]+(?![^\[]*\])\m

这一个获取起始序列中的文本:

\(?<=--\+).*?(?=\|)\m

我的问题是将所有这些部分连接在一起,以我想要的方式工作。我开始认为Regex的工作方式是不可能的,但我想我应该在这里尝试一下,看看更有经验的人是否会有任何见解。

uxhixvfz

uxhixvfz1#

我不太了解Sublime的语法高亮,但假设它使用现代JavaScript,你可能可以使用这样的表达式:

/(?<=^--+.*?)\s*(?<!\[.)\b\w+\s*/g

这将搜索出现在以--+开头且前面没有[*的行中的单词(其中 * 是任何一个字符)
当在JavaScript正则表达式引擎中运行时,它会产生以下结果:

Array.from(
  "--+Move|Go [$Num] spaces [&Direction]".matchAll(
    /(?<=^--+.*?)\s*(?<!\[.)\b\w+\s*/g
  )
)
// [["Move"],["Go "],[" spaces "]]
yquaqz18

yquaqz182#

这里的解决方案应该工作,即使没有假设方括号包含单个单词:

(?<=^--\+)\w+?(?=\|)|(?<=^--\+.+\|.*)(?<=^([^\]\[\n]*\[[^\]\[\n]*])*[^\]\[]*)[^\]\[\n]++

这里:

  • (?<=^--\+)\w+?(?=\|)匹配--+|之间的字,在行的开头,
  • (?<=^--\+.+\|.*)(?<=^([^\]\[\n]*\[[^\]\[\n]*])*[^\]\[\n]*)[^\]\[\n]++匹配行中以--+开头的方括号外的所有单词:
  • (?<=^--\+.+\|.*)检查其中字从--+word|开始匹配行,
  • (?<=^([^\]\[\n]*\[[^\]\[\n]*])*[^\]\[\n]*)检查匹配单词的左边是否有所有的左方括号和右方括号。这样我们就可以确定我们的单词在方括号之外。

演示here

相关问题