我有一个不寻常的应用程序,因此我需要提取正则表达式模式的后向和前瞻部分的内容(当然要使用正则表达式!)。例如以下模式:
(?<=(?:c|d))123(?=(?:x|y))
与以下字符串中的第一个123
匹配:
abc123xyz123xyz
我需要提取以下字符串:
(?:c|d)
和
(?:x|y)
很难证明,因为我不能轻易找到正确的右括号,因为在示例中可能还会有其他括号。
只是想知道以前是否有人必须这样做。欢迎任何想法
根据对问题的评论,我的理解是,询问者Kaveh1000对Wiktor的解决方案感到满意;但是似乎他对该解决方案的一部分感到困惑
(\((?:[^()]++|(?1))*\))
[我将尝试解释其工作原理(但我建议读Mastering Regular Expressions, 3rd Edition,该词专门用于该主题):
(…)
,我们可以在需要时参考(并且确实在4.2中进行此操作。]]]\(…\)
之间的文字感觉异常;(?:…)*
之间的东西是0或更多(普通贪婪)未捕获表达式的序列;[0个或多个重复中的每个都可以是
4.1。一个由0或多个非括号组成的序列[^()]++
(我链接的书还解释了为什么++
的所有格版本+
在这里是必需的;我知道++
does
4.2。或(?1)
之类的东西,与我们现在要匹配的正则表达式匹配(第1点);这是正则表达式的递归性。
[请注意,文字括号仅通过\(
和\)
出现在正则表达式的此部分中,这两个命令是有序的(先打开,然后关闭),并且两者必须匹配;这样可以保证正则表达式的这一部分仅与均衡的感觉匹配。