用于在C#中解析Wikicode的正则表达式

Aag*_*nor 1 c# regex

我尝试解析维基百科的文章.我使用*page-articles.xml文件,他们以wikicode格式备份所有文章.为了去除格式并获取原始文本,我尝试使用正则表达式,但我不是很习惯它.我使用C#作为编程语言.我尝试使用正则表达式的设计师Expresso,但我的智慧结束了.这是我想要实现的目标:

该文本可以包含以下结构:[[TextN]]或[[Text1 | TextN]]或[[Text1 | Text2 | ... | TextN]]

[[....]]模式可以出现在Texti中.我想用TextN替换这些结构

为了在文本中识别结构,我尝试了以下RegEx:

\[\[ ( .* \|?)* \]\]
Run Code Online (Sandbox Code Playgroud)

Expresso似乎与这个一起运行并且无限循环.在相对较小的文本5分钟后,我取消了测试运行.

然后我尝试了更简单的东西,我想在括号之间捕捉任何东西:

\[\[ .* \]\]
Run Code Online (Sandbox Code Playgroud)

但是当我有一条线:

[[Word1]] text inbetween [[Word2]]
Run Code Online (Sandbox Code Playgroud)

表达式返回整行,而不是

[[字1]

[[字2]]

Regex-Experts的任何提示都可以解决这个问题吗?

先谢谢你,弗兰克

Chr*_*ser 5

我不会使用正则表达式(因为它们不能很好地处理递归/嵌套).

相反,我会手工解析文本*,这在这种情况下并不是特别困难.

您可以将文本表示为元素流,而每个元素都是

  • 纯文本,或
  • 一个标签

一个标签可以包含多个元素流,通过分离|.

elementStream ::= element*
element ::= chunk | tag
chunk ::= TEXT
tag ::= "[[" elementStream otherStreams "]]"
otherStreams ::= "|" elementStream otherStreams
Run Code Online (Sandbox Code Playgroud)

您的解析器可以使用方法表示每个定义.所以,只要有可用的文本,接下来的两个字符不是"]]"或"|",你就会有一个elementStream方法可以调用 element(如果你在标签内).每次调用element都会返回解析的元素,无论是块还是标记.等等

这本质上是一个递归下降解析器.维基百科:http://en.wikipedia.org/wiki/Recursive_descent_parser(文章很长/很复杂,不幸的是)