找到一个优雅的单一正则表达式的JavaScript regexp倍数的内部模式

时间:2015-12-04 16:55:12

标签: javascript regex

这是匹配文字:

bla bla bla <!--[mixed token 1][mixed token 2][...]-->

我只需要text.match(/.../)数组中的标记。

我可以通过首先匹配评论中的所有内容然后在[mixed token 1][mixed token 2]上运行第二个模式来解决这个问题,但我尝试的其他所有内容都没有给出干净的结果。

这样的东西对于包含单一标记模式的文本非常有效,但是解决了上述问题。 /<!--\[(.*?)\]-->/

我想出的最好的一切总是想回归&#34; mixed token 1][mixed token 2&#34;

@note,目标是不限制评论书挡中可存在的[令牌]集数量

regexr根据jcaron的工作开始

1 个答案:

答案 0 :(得分:1)

你可以尝试:

/<!--(?:\[([^\]]+)\])(?:\[([^\]]+)\])?(?:\[([^\]]+)\])?(?:\[([^\]]+)\])?(?:\[([^\]]+)\])?(?:\[([^\]]+)\])?-->/

您可以添加更多可选的非捕获组来捕获更多令牌,当然,您可能需要处理令牌之间或周围的空间等。

示例:

"bla bla bla <!--[mixed token 1][mixed token 2]-->".match(/<!--(?:\[([^\]]+)\])(?:\[([^\]]+)\])?(?:\[([^\]]+)\])?(?:\[([^\]]+)\])?(?:\[([^\]]+)\])?(?:\[([^\]]+)\])?-->/)

结果:

["<!--[mixed token 1][mixed token 2]-->", "mixed token 1", "mixed token 2", undefined, undefined, undefined, undefined]

所以你在第1个位置获得了令牌,并在返回的数组中跟随。

显然,这并不像匹配整个评论那样通用,然后使用另一个正则表达式匹配或某种分割。