如何使用SPARQL正则解析Wikitext并提取维基共享资源模板参数值
问题1:合并两条正则表达式的方法
你之前合并失败是因为没有处理跨换行匹配、以及捕获组的嵌套逻辑。直接把参数提取逻辑嵌入到模板匹配的规则中即可,合并后的正则如下:
{{Images from Auckland Museum\|section=([^|]+)\|object=([^|]+)\|id=([^}]+)}}
这个表达式不需要匹配全文,只要扫描到目标模板片段就能直接拿到section、object、id三个捕获组的结果,省去二次拆分的步骤。如果参数顺序可能变化,也可以用不绑定顺序的兼容写法:
{{Images from Auckland Museum\|(?:.*?section=([^|]+))?(?:.*?object=([^|]+))?(?:.*?id=([^}]+))?.*?}}
问题2:递归正则的使用与SPARQL支持情况
首先你的场景完全不需要用到递归正则:你要提取的参数固定为3个,直接写对应捕获组的效率远高于递归匹配。如果要处理不定数量的参数,更简单的方案是先提取键值对完整片段,再用|拆分字符串后逐个处理,逻辑更清晰也更容易维护。
Wikidata SPARQL端点使用的是Apache Jena ARQ引擎,其正则功能基于Java标准正则库实现,不支持递归正则特性,因此你没法在这个场景下使用递归正则。
问题3:提前终止匹配的实现与效率收益
可以实现,而且能明显提升匹配效率。你原来的第一条正则用了^.+和.+$会强制扫描整个文本的首尾,修改成如下写法即可:
{{Images from Auckland Museum\|(.*?)}}
正则引擎扫描到第一个闭合的}}就会停止捕获,不会继续处理后面无关的Wikitext内容,对于长文本来说可以减少大量不必要的字符扫描操作,性能提升非常明显。
内容的提问来源于stack exchange,提问作者Hugh
相关产品推荐
相关产品推荐

