java - 使用 Regex 迭代 XML 文本

标签 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>

最佳答案

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

    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> ,这就是为什么正则表达式不是一个好的选择。

关于java - 使用 Regex 迭代 XML 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42018158/

相关文章:

java - hibernate session ID

java - 相机预览不起作用 : Error while loading camera

python - 如何将空格分隔的数据转换为 csv 格式 - Python

javascript - 变音符号的正则表达式

java - 匹配不在行开头的表达式的正则表达式

python - 如何在正则表达式中动态捕获一行文本中的两个日期?

python - RegEx 如何根据特定位置的字符否定匹配

java - 运行 Maven2 构建时使用不同的 Java 源版本

java - jHiccup:直方图数据似乎不一致

javascript - 正则表达式除了完整字符串而不是字符串内的部分