我正在尝试将降价标签与递归匹配。输入语法(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))*+\)
1 回答
慕桂英4014372
TA贡献1871条经验 获得超13个赞
您应该使用积极的前瞻来匹配以确保匹配以该模式开头,但您必须将整个括号匹配模式包装在另一个捕获组中并使用(?1)子例程而不是(?R)仅递归该模式,而不是整个正则表达式:
(?=\([a-z0-9_-]+:)(\((?:[^()]+|(?1))*+\))
^^^^^^^^^^^^^^^^^^^ ^^^^ ^
请参阅正则表达式演示。
细节
(?=\([a-z0-9_-]+:)- 一个正向前瞻,需要(1+ 小写 ASCII 字母、数字、下划线或连字符,:紧跟在当前位置的右侧
(\((?:[^()]+|(?1))*+\))- 捕获组 1(稍后将递归):
\(-(
(?:[^()]+|(?1))*+- 1+ 重复 1+ 除(和)或整个 Group 1 模式以外的任何字符(递归)
\)-)
如果您还想支持笑脸,您可以将它们的特定模式添加到正则表达式子例程所在的交替组中,作为第一种选择:
(?=\([a-z0-9_-]+:)(\((?::[)(]|[^()]|(?1))*+\))
^^^^^
我在后面添加:[)(]匹配:)或:(删除+,[^()]以便能够逐个字符地检查嵌套括号内的字符串。
随意调整它以适应您的需求,或添加更多笑脸图案。
使用正则表达式查看这个正则表达式演示(?=\([a-z0-9_-]+:)(\((?::(?:[()pPDd*oO]|'\()|<3|;\)|[^()]|(?1))*+\))。
- 1 回答
- 0 关注
- 120 浏览
添加回答
举报
0/150
提交
取消