在前瞻后捕获文本

时间:2016-05-23 08:56:52

标签: regex

我有一个文本,这是一些文本,由<null>或路径填充,最后在paranthese中。我想捕获pattern1和pattern2(开头是..或/):

pattern1 <null> (not important)
pattern1 ../pattern2 (not important)
pattern1 /pattern2 (not important)

我期望连接第2和第3个捕获组我得到pattern2,但不是

(.+)(?=(<null>|( \.\.| \/)))(.+)(.*)(?= \()

输入:pthread_create /usr/include/c++/5/thread:115 (library) 结果:

pthread_create
 /
 /

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

在正则表达式中,\.\.匹配两个点,但不会捕获/之后的(<null>|( \.\.| \/)),因此,lands in Group 4。此外,在其中保留一个带有捕获组的正向前瞻是没有意义的,因为它在结果中创建了不必要的组,您可以将(.+?)(<null>| (?:\.\.\/|\/))(.*?)(?= \() 移动到消费模式部分。

您可以使用

(.+?)

请参阅regex demo

模式匹配:

  • (<null>| (?:\.\.\/|\/)) - (第1组)除了换行符之外的任何一个或多个字符,在第一次出现之前尽可能少...
  • <null> - (第2组)../或后跟/(.*?)(?= \()
  • 的空格
  • ( - (第3组)零个或多个任何字符,但换行符尽可能少,直到第一次出现空格后跟update mytbl a inner join mytbl b on a.formid <> b.formid set a.id = b.id where a.id in (1,2) and b.id in (1,2)