Wiki-markup存储[[和]]之间的链接,也就是说,如果我写[[PageTitle]],Wikipedia将生成一个指向名为 PageTitle 的内部页面的链接。但是,还可以使用[[]]生成其他链接,例如“类别”,“文件”,“帮助”,“特殊”等...
为了排除这些,我提出了以下正则表达式:
\[\[(?!Category|Wikipedia|File|Help|User talk|Special)(.*?)\]\]
这适用于大多数场景,除了引用(我首先不需要)。引用存储在 ref XML标记(<ref></ref>
)中。例如:
<ref>"The remedy has been found: libertarian communism."
[http://www.theanarchistlibrary.org/HTML/Sebastien_Faure__Libertarian_Communism.html
[[Sébastien Faure]. "Libertarian Communism"]</ref>
理想情况下,我可以完全跳过引用,但至少,读取字符串中没有的项目可能会解决这个问题。
我知道大多数人都会告诉我不要使用正则表达式来解析wiki-markup,但是我将解析维基百科中的所有链接(通过他们的XML转储),这意味着我可以编写最轻的代码,这样更好
答案 0 :(得分:1)
因为看起来你可以使用环顾四周 添加了测试用例
# \[\[(?!Category|Wikipedia|File|Help|User\ talk|Special)((?:(?![\[\]]).)*)\]\]
\[\[
(?!
Category
| Wikipedia
| File
| Help
| User\ talk
| Special
)
(
(?:
(?! [\[\]] )
.
)*
)
\]\]
Perl测试用例
$/ = undef;
$str = <DATA>;
while ( $str =~ /\[\[(?!Category|Wikipedia|File|Help|User\ talk|Special)((?:(?![\[\]]).)*)\]\]/g )
{
print "$1\n";
}
__DATA__
[[Link 1]] and [[Link 2]]
ref>"The remedy has been found: libertarian communism."
[http://www.theanarchistlibrary.org/HTML/Sebastien_Faure__Libertarian_Communism.html
[[Sébastien Faure]. "Libertarian Communism"]</ref>
[[Link 3]] and [[Link 4]]
输出&gt;&gt;
Link 1
Link 2
Link 3
Link 4