提问者:小点点

我如何使用regex来捕获每行的第n个模式?


背景:

对于Sublime Text中的语法突出显示,
您可以使用相应的tmTheme文件编写tmLanguage文件。

< code>tmLanguage文件包含正则表达式,您可以在其中指定名称,< br >然后< code>tmTheme文件使用这些名称来设置所捕获内容的样式。

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

问题:

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

任何东西都可能在里面

表达式 1 将捕获

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

<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个答案

匿名用户

您可以使用

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

匹配第二个值。然后,只需增加< code>1即可获得更多的值。

这是一个演示

第三个值将与(?m)^(?:

匿名用户

您可以:

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

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

演示(在3个版本中循环,查看所有示例...)

好的,你可以这样做:

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

其中N是您寻找的那个。

演示