正则表达式非捕获括号问题

问题描述:

我有一个数据库查询,看起来像这样正则表达式非捕获括号问题

select * from students join (select * from teachers) join (select * from workers 

我有一个要求来标记基于“选择”这个字符串。 我正在尝试使用正则表达式(select)(.*?)((?:select)|$),它只匹配2次。 请求一些关于如何实现这一点的指针。

我需要3个输出记号如下

  • select * from students join (
  • select * from teachers) join (
  • select * from workers
+0

结果标记的外观应该如何? –

+0

预期结果是什么?请将其添加到您的帖子。 –

+0

在'(?:select)'中,非捕获括号是无用的......可能是'(select)'中的括号。你为什么把它们放在这里? – Robin

我认为这正则表达式将工作:

select.*?(?=select|$) 

正则表达式字select,那么任何文本相匹配(不包括新线)直到下一个select或字符串的末尾。

此处示范:http://regex101.com/r/sR3gV1

+0

不错!如果你选择。*?一个捕获组,你可以看到这三个标记:http://regex101.com/r/uZ8dP9 – jonas

+0

@jonas这真的取决于如何实现正则表达式。鉴于什么是Sushant已经,我不'我认为捕捉小组是必要的。 –

+0

绝对正确,它们不是必需的,但在regex101中结果更好可见...;) – jonas

如果你试图解析字符串中的SELECT查询,那么你可以使用这个正则表达式。假设你是不是做选择从多个表(即不这样做select * from x,y,z

(select.*?from\\s+\\w+)