我尝试解析来自维基百科的文章。我使用 *page-articles.xml 文件,他们在其中以 wikicode 格式备份所有文章。为了剥离格式并获取原始文本,我尝试使用正则表达式,但我不太习惯。我使用 C# 作为编程语言。 我尝试了一些正则表达式设计器 Expresso,但我已经无计可施了。这是我想要实现的目标:
文本可以包含以下结构: [[TextN]] 或 [[Text1|TextN]] 或 [[Text1|Text2|...|TextN]]
[[ .... ]] 模式也可以出现在 Texti 中。我想用 TextN 替换这些结构
为了识别文本中的结构,我尝试了以下 RegEx:
\[\[ ( .* \|?)* \]\]
Expresso 似乎与此一起运行并无限循环。 5 分钟后,我取消了测试运行。
然后我尝试了一些更简单的方法,我想捕获括号之间的任何内容:
\[\[ .* \]\]
但是当我有这样一行时:
[[Word1]] text inbetween [[Word2]]
表达式返回整行,而不是
[[Word1]]
[[Word2]]
这里的 Regex-Experts 有什么解决问题的技巧吗?
提前致谢, 弗兰克
请您参考如下方法:
我不会使用正则表达式(因为它们不能很好地处理递归/嵌套)。
相反,我会手动解析文本*,在这种情况下这并不是特别困难。
您可以将文本表示为元素流,而每个元素要么是
- 一个纯文本 block ,或者
- 一个标签
一个标签可能包含多个元素流,由|分隔。
elementStream ::= element*
element ::= chunk | tag
chunk ::= TEXT
tag ::= "[[" elementStream otherStreams "]]"
otherStreams ::= "|" elementStream otherStreams
您的解析器可以用一个方法来表示这些定义中的每一个。因此,只要有可用文本并且接下来的两个字符不是“]]”或“|”,您就会有一个 elementStream 方法调用 element (如果你在标签内)。 每次调用 element 都会返回解析的元素,一个 block 或一个标签。等
这本质上是一个递归下降解析器。 维基百科:http://en.wikipedia.org/wiki/Recursive_descent_parser (不幸的是,这篇文章相当长/复杂)
