regex从regex模式中提取lookback和lookahead
我有一个不寻常的应用程序,需要提取regex模式的lookback和lookahead部分的内容(当然使用regex!)。例如,在以下模式中:regex从regex模式中提取lookback和lookahead,regex,regex-lookarounds,Regex,Regex Lookarounds,我有一个不寻常的应用程序,需要提取regex模式的lookback和lookahead部分的内容(当然使用regex!)。例如,在以下模式中: (?<=(?:c|d))123(?=(?:x|y)) 我需要的是提取以下字符串: (?:c|d) 及 事实证明这很难,因为我很难找到正确的结束括号,因为可能还有其他括号,如示例中所示 我只是想知道以前是否有人必须这样做。欢迎任何想法根据对问题的评论,我的理解是,提问者Kaveh1000对Wiktor的解决方案感到满意;然而,他似乎对解决方案的一
(?<=(?:c|d))123(?=(?:x|y))
我需要的是提取以下字符串:
(?:c|d)
及
事实证明这很难,因为我很难找到正确的结束括号,因为可能还有其他括号,如示例中所示
我只是想知道以前是否有人必须这样做。欢迎任何想法根据对问题的评论,我的理解是,提问者Kaveh1000对Wiktor的解决方案感到满意;然而,他似乎对解决方案的一部分感到困惑
(\((?:[^()]++|(?1))*\))
在这方面,我建议阅读,这篇文章用了很多词来讨论这个话题(特别是这个正则表达式);我刚刚从那里读到,下面我试图表达我的理解:
(…)
,如果需要,我们可以参考它(在4.2中确实如此)李>
\(…\)
之间的内容相匹配李>
(?:…)*
,是0个或多个(普通贪婪的)未捕获表达式的序列李>
[^()]+
4.2。或者一些东西,(?1)
,它与我们现在匹配的同一个正则表达式相匹配(第1点);这是正则表达式的递归性- 文字括号仅通过
和\(
出现在正则表达式(这部分)中,它们是有序的(先打开,然后关闭),并且两者必须匹配;这保证了正则表达式的这一部分仅与平衡的parethesis匹配\)
是必需的,因为如果正则表达式是++
,那么有许多方法可以为((某物)+*
和++
分配大量重复,并且必须尝试所有这些方法<代码>+而不是*
将尽可能匹配,因为它在+
中是单独存在的,只有到那时(某物)+
才会生效*
- 但是,
本身是什么?我的意思是,除了在这个正则表达式中需要它的原因之外,+
是什么?与++
相比,一种简单的方法是比较正则表达式+
和a+ab
与包含a++ab
的行的行为,以隔离并清楚地看到aaaaaaa b
的效果。前者将匹配整行,其中+
匹配前5个a+
s,a
匹配后两个字符;后者不会匹配,因为ab
会匹配尽可能多的a++
s,而不会放弃对regex其余部分的支持,从而匹配所有6个a
,也不会给a
留下任何匹配的机会,最终导致匹配失败ab
(?想象一个正则表达式,如:(?对于PCRE,类似(?s)(?将有所帮助。请参见.NET中的(?替换为(?Forth Bird.谢谢。我可以这样做,但不幸的是,我仍然有找到正确匹配的结束括号的问题。@Kaveh1000,我试图为这个令你和我困惑的正则表达式提供一个答案。我不知道什么是++
,但现在它对我来说更清楚了,也许它也能让你更清楚。
(?:x|y)
(\((?:[^()]++|(?1))*\))