javascript - 限制 RegEx 表达式中的捕获范围

标签 javascript regex

(注意:以下是使用 javascript 风格的 RegExen,其中 . 不匹配换行符,但 [^] 匹配。)

假设我有这段文字:

chaff 更多 chaff START PATTERN 更多 chaff chaff more chaff 开始模式多汁的东西 多汁的东西 多汁的东西 结束模式 谷壳 谷壳开始模式更多多汁的东西更多 多汁的东西结束模式

...我想要一个带有全局标志 (g) 的 RegEx 来捕获有趣的东西。具体来说,我希望第一场比赛是

开始模式多汁的东西 多汁的东西 多汁的东西 END PATTERN

第二场比赛是

START PATTERN 更多有趣的东西 多汁的东西结束模式

美中不足的是第一个 START PATTERN。我在 regex101.com(对于那些不知道它的人来说是一个很棒的工具)上花了一些时间,但这个不起作用:

/(?:START PATTERN[^]+)?(START PATTERN[^]+END PATTERN)/?

它捕获了第二组(“多汁的东西”)但没有捕获第一组。我也尝试过各种负面前瞻的组合,但没有成功。

想法?

最佳答案

你需要一个 tempered greedy token :

START PATTERN(?:(?!(?:START|END) PATTERN)[^])*END PATTERN
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

参见 the regex demo .

(?:(?!(?:START|END) PATTERN)[^])* 被称为缓和贪婪标记,因为贪婪 * 量词是消极的前瞻性调和。在 lookahead 中,我们列出了所有不想与尾随定界符匹配的模式。

请注意,如果您打算匹配文字单词 STARTEND,您可以通过添加单词边界来提高精度:

\bSTART PATTERN\b(?:(?!\b(?:START|END) PATTERN)[^])*\bEND PATTERN

请注意,为了提高效率,我们可以展开它:

START PATTERN[^ES]*(?:S(?!TART PATTERN)[^ES]*|E(?!ND PATTERN)[^ES]*)*END PATTERN

参见 another demo

关于javascript - 限制 RegEx 表达式中的捕获范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34880673/

相关文章:

php - 需要一个正则表达式来用左代替右,右代替左

ruby - 正则表达式有助于跳过第一次出现的特殊字符,同时允许后面出现特殊字符但不允许空格

javascript - 隐藏选择下拉项上的自动完成建议列表并输入单击

javascript - 获取选项标签之间的文本以与 Google map 路线计算器一起使用

php - 每行以双连字符开头的正则表达式

c# - 删除部分 Regex.Match 字符串

regex - 需要识别邮政编码范围

javascript - 如何在 iOS 中从 javascript 调用 Objective-C 函数

javascript - react 条件渲染,在渲染中返回数组, react 16

javascript - 如何不仅将 id 而且将完整对象传递到数组列表中