使用Regex迭代XML文本

时间:2017-02-03 06:35:01

标签: java regex regex-lookarounds

我有一堆XML文本需要迭代并提取一些数据。我知道正则表达式并不是最好的方法,但我需要提取的数据很少,而且我已经成功地通过正则表达式完成了。我面临的问题是我需要按顺序显示数据。下面的数据是我从中提取信息但是我需要在段落方面进行,因此需要迭代 pnum = 1,pnum = 2 .... 值,这些值标记了该特定的开头段。如何使用正则表达式迭代这个?正则表达式看起来有助于此吗?

第一段:

<p pnum=1>
<s snum=1>
<wf cmd=done pos=NN lemma=committee wnsn=1 lexsn=1:14:00::>Committee</wf>
<wf cmd=done pos=NN lemma=approval wnsn=1 lexsn=1:04:02::>approval</wf>
<wf cmd=ignore pos=IN>of</wf>
<wf cmd=done rdf=person pos=NNP lemma=person wnsn=1 lexsn=1:03:00:: pn=person>Gov._Price_Daniel</wf>
<wf cmd=done pos=NN lemma=banker wnsn=1 lexsn=1:18:00::>bankers</wf>
<punc>.</punc>
</s>
</p>

第二段:

<p pnum=2>
<s snum=2>
<wf cmd=done rdf=person pos=NNP lemma=person wnsn=1 lexsn=1:03:00:: pn=person>Daniel</wf>
<wf cmd=done pos=RB lemma=personally wnsn=1 lexsn=4:02:01::>personally</wf>
<wf cmd=done pos=VB lemma=lead wnsn=7 lexsn=2:41:00::>led</wf>
<punc>.</punc>
</s>
</p>

1 个答案:

答案 0 :(得分:1)

关键是使用非贪婪的限定符.*?一次只能获取一个段落的内容

    Pattern p = Pattern.compile("<p pnum=([0-9]+)>.*?</p>", Pattern.DOTALL);
    Matcher m = p.matcher(text);
    while(m.find()) {
        System.out.format("******Paragraph %s*****%n", m.group(1));
        System.out.println(m.group(0));
    }

如果有任何嵌套段落<p>...</p>,这当然会失败,这就是正则表达式不是一个好选择的原因。