regex从regex模式中提取lookback和lookahead

regex从regex模式中提取lookback和lookahead,regex,regex-lookarounds,Regex,Regex Lookarounds,我有一个不寻常的应用程序,需要提取regex模式的lookback和lookahead部分的内容(当然使用regex!)。例如,在以下模式中: (?<=(?:c|d))123(?=(?:x|y)) 我需要的是提取以下字符串: (?:c|d) 及 事实证明这很难,因为我很难找到正确的结束括号,因为可能还有其他括号,如示例中所示 我只是想知道以前是否有人必须这样做。欢迎任何想法根据对问题的评论,我的理解是,提问者Kaveh1000对Wiktor的解决方案感到满意;然而,他似乎对解决方案的一

我有一个不寻常的应用程序,需要提取regex模式的lookback和lookahead部分的内容(当然使用regex!)。例如,在以下模式中:

(?<=(?:c|d))123(?=(?:x|y))
我需要的是提取以下字符串:

(?:c|d)

事实证明这很难,因为我很难找到正确的结束括号,因为可能还有其他括号,如示例中所示


我只是想知道以前是否有人必须这样做。欢迎任何想法

根据对问题的评论,我的理解是,提问者Kaveh1000对Wiktor的解决方案感到满意;然而,他似乎对解决方案的一部分感到困惑

(\((?:[^()]++|(?1))*\))
在这方面,我建议阅读,这篇文章用了很多词来讨论这个话题(特别是这个正则表达式);我刚刚从那里读到,下面我试图表达我的理解:

  • 它是一个捕获组
    (…)
    ,如果需要,我们可以参考它(在4.2中确实如此)
  • 它将一对文本parethesis与介于
    \(…\)
    之间的内容相匹配
  • 介于两者之间的东西,
    (?:…)*
    ,是0个或多个(普通贪婪的)未捕获表达式的序列
  • 这0个或更多重复中的每一个都可以是

    4.1。0个或多个非括号的序列,
    [^()]+

    4.2。或者一些东西,
    (?1)
    ,它与我们现在匹配的同一个正则表达式相匹配(第1点);这是正则表达式的递归性

  • 注二:

    • 文字括号仅通过
      \(
      \)
      出现在正则表达式(这部分)中,它们是有序的(先打开,然后关闭),并且两者必须匹配;这保证了正则表达式的这一部分仅与平衡的parethesis匹配
    • ++
      是必需的,因为如果正则表达式是
      ((某物)+*
      ,那么有许多方法可以为
      ++
      *
      分配大量重复,并且必须尝试所有这些方法<代码>+而不是
      +
      将尽可能匹配,因为它在
      (某物)+
      中是单独存在的,只有到那时
      *
      才会生效
    • 但是,
      +
      本身是什么?我的意思是,除了在这个正则表达式中需要它的原因之外,
      ++
      是什么?与
      +
      相比,一种简单的方法是比较正则表达式
      a+ab
      a++ab
      与包含
      aaaaaaa b
      的行的行为,以隔离并清楚地看到
      +
      的效果。前者将匹配整行,其中
      a+
      匹配前5个
      a
      s,
      ab
      匹配后两个字符;后者不会匹配,因为
      a++
      会匹配尽可能多的
      a
      s,而不会放弃对regex其余部分的支持,从而匹配所有6个
      a
      ,也不会给
      ab
      留下任何匹配的机会,最终导致匹配失败

    如果您可以访问lookarounds中捕获组的值,您可以将非捕获组转换为捕获组,并使用字符类来匹配单个字符,而不是交替的
    (?想象一个正则表达式,如:
    (?对于PCRE,类似
    (?s)(?将有所帮助。请参见.NET中的
    (?替换为
    (?Forth Bird.谢谢。我可以这样做,但不幸的是,我仍然有找到正确匹配的结束括号的问题。@Kaveh1000,我试图为这个令你和我困惑的正则表达式提供一个答案。我不知道什么是
    ++
    ,但现在它对我来说更清楚了,也许它也能让你更清楚。
    (?:x|y)
    
    (\((?:[^()]++|(?1))*\))