如何使用正则表达式捕获每行上的第n个模式?

时间:2015-07-18 18:50:08

标签: regex syntax-highlighting sublimetext3 oniguruma

背景:

对于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

2 个答案:

答案 0 :(得分:1)

您可以使用

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

匹配第二个值。然后,只需递增1即可获得更多值。

这是demo

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

答案 1 :(得分:0)

你可以这样做:

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

其中TGT是您寻求的,N是匹配。

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

好的,你可以这样做:

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

N是您寻求的那个。

Demo