我尝试解析维基百科的文章.我使用*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的任何提示都可以解决这个问题吗?
先谢谢你,弗兰克
我不会使用正则表达式(因为它们不能很好地处理递归/嵌套).
相反,我会手工解析文本*,这在这种情况下并不是特别困难.
您可以将文本表示为元素流,而每个元素都是
一个标签可以包含多个元素流,通过分离|.
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(文章很长/很复杂,不幸的是)