PHP/PCRE 正则表达式以递归模式开头

我正在尝试将降价标签与递归匹配。


输入语法


(TYPE: VALUE ATTR_KEY: ATTR_VALUE)

请注意,语法应以:[a-z0-9_-]+:


样本输入:


(image: sky.jpg)

(image: sky.jpg caption: Sky (Issue This) View)

(link: https://stackoverflow.com text: Stack Overflow)

(link: https://stackoverflow.com text: Stack Overflow rel=nofollow)

(video: http://www.youtube.com/watch?v=49Kh1mS4Fhs)

目前使用以下正则表达式:


(?=[^\]])\([a-z0-9_-]+:.*?\)

但是问题来自这里,因为匹配:


(image: sky.jpg caption: Sky (Issue This)

预期匹配:


(image: sky.jpg caption: Sky (Issue This) View)

如果在括号中再次使用括号,则不完全匹配。


我尝试遵循递归模式和工作,但我需要限制以字符开头。


(?s)\((?:[^()]+|(?R))*+\)

\((?:[^)(]+|(?R))*+\)


凤凰求蛊
浏览 121回答 1
1回答

慕桂英4014372

您应该使用积极的前瞻来匹配以确保匹配以该模式开头,但您必须将整个括号匹配模式包装在另一个捕获组中并使用(?1)子例程而不是(?R)仅递归该模式,而不是整个正则表达式:(?=\([a-z0-9_-]+:)(\((?:[^()]+|(?1))*+\))^^^^^^^^^^^^^^^^^^^&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^^^^&nbsp; &nbsp; &nbsp;^请参阅正则表达式演示。细节(?=\([a-z0-9_-]+:)- 一个正向前瞻,需要(1+ 小写 ASCII 字母、数字、下划线或连字符,:紧跟在当前位置的右侧(\((?:[^()]+|(?1))*+\))- 捕获组 1(稍后将递归):\(-((?:[^()]+|(?1))*+- 1+ 重复 1+ 除(和)或整个 Group 1 模式以外的任何字符(递归)\)-)如果您还想支持笑脸,您可以将它们的特定模式添加到正则表达式子例程所在的交替组中,作为第一种选择:(?=\([a-z0-9_-]+:)(\((?::[)(]|[^()]|(?1))*+\))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^^^^^&nbsp;&nbsp;我在后面添加:[)(]匹配:)或:(删除+,[^()]以便能够逐个字符地检查嵌套括号内的字符串。随意调整它以适应您的需求,或添加更多笑脸图案。使用正则表达式查看这个正则表达式演示(?=\([a-z0-9_-]+:)(\((?::(?:[()pPDd*oO]|'\()|<3|;\)|[^()]|(?1))*+\))。
打开App,查看更多内容
随时随地看视频慕课网APP