正则表达式通过忽略内部标签来匹配结束标签
我想捕获 MediaWiki 格式的图像标签,例如,
[[图片:Justus Sustermans - Galileo Galilei (Uffizi) 的肖像).jpg|left|thumb|upright|[[Galileo]] 通常被称为 [[现代天文学]] 之父,肖像由 [[Justus Sustermans] ] ]]
我必须忽略内部[[...]]以匹配整体(以粗体[[和 显示]])。我想出了
[[Image:((?:[^]]*+(?:(?![[)|(?R))*+)*+)]]
但它停在第一个]]。
小提琴
回答
或者您可以寻找平衡的方括号,但使用环视限制两端的规则:
(?=[[Image:)([(?:[^][]|(?1))*])(?<=]])
(?=[[Image:)前瞻搜索以开头的字符串[[Image:([(?:[^][]|(?1))*])使用递归平衡嵌套方括号(?<=]])Lookbehind 搜索以结尾的字符串]]
查看测试用例
如果您不关心里面的括号是否平衡,但只想做出假设并排除[[ ]]对。这个应该可以解决问题:
[[Image:(?:[[.*?]]|.)*?]]
查看测试用例