1 回答

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 关注
- 149 浏览
添加回答
举报