3

背景:

对于 Sublime Text 中的语法高亮,
您可以编写一个tmLanguage带有相应文件的tmTheme文件。

tmLanguage文件包含您为其命名的正则表达式,
然后该tmTheme文件使用这些名称来设置捕获的内容的样式。

我想根据之前出现的重复图案的数量对相同的图案进行不同的着色。或者,换一种说法,我想以不同的方式设置每行上每个模式的第 n 个匹配项。

问题:

例如,
如何编写 3 个正则表达式来匹配以下粗体组?

<foo> <bar><baz>
<foo> <bar> <baz>
<foo><bar> <baz>

任何东西都可以在 < > 里面。

表达式 1 将捕获表达式的第一个实例<*.?>
2 将捕获表达式的第二个实例<*.?>
3 将捕获的第三个实例<*.?>

假设上面的三个例子实际上是同一行。
我的目标是让每个组都有不同的颜色

<this would be red> <this would be orange> <this would be yellow> <etc..>

正则表达式语言是Oniguruma


到目前为止我的尝试:

我可以像这样捕获第一组:

^<.*?>

我不知道如何只捕获第二组

^<.*?>{2}            captures nothing
<.*?>{2}             captures nothing
<.*?>{2,}            captures nothing
^(?:<.*?>)<.*?>      captures 1st and 2nd 
^(?!<.*?>)<.*?>      captures nothing
^(?=<.*?>)(<.*?>)    captures 1st
^(?=<.*?>)(<.*?>){1} captures 1st
^(?=<.*?>)(<.*?>){2} captures 1st and 2nd
(?=<.*?>)(<.*?>)     captures everything
4

2 回答 2

1

您可以使用

(?m)^(?:<[^>]*>[[:blank:]]*){1}\K<[^>]*>

匹配第二个值。然后,只需增加1以获得更多值。

这是一个演示

第三个值将与(?m)^(?:<[^>]*>[[:blank:]]*){2}\K<[^>]*>等匹配。

于 2015-07-18T19:31:30.793 回答
0

你可以做:

(?:(?:\s*<\s*(?!TGT)\w+\s*>\s*)*(<\s*TGT\s*>)){N}

你在哪里TGT寻找和N匹配。

演示 (循环浏览 3 个版本以查看所有示例...)


好的,你可以这样做:

/^((<[^>]*>){N-1})((<[^>]*>))/gm

N你要找的人在哪里。

演示

于 2015-07-18T19:15:08.630 回答