正则表达式从已解析的单词文档

时间:2016-09-23 09:55:34

标签: java regex xml ms-word

我尝试创建一个正则表达式来匹配我的word文档中的一部分文本。 在Word文档中,我有类似这样的内容{LigneDetails.Libelle}所以当我用java处理这个文件时,它会生成如下:

<w:t>{</w:t>
         </w:r>
         <w:proofErr w:type="spellStart" />
         <w:r w:rsidRPr="009664EA">
            <w:t>SOCIETE.RaisonSociale</w:t>
         </w:r>
         <w:proofErr w:type="spellEnd" />
         <w:r w:rsidRPr="009664EA">
 <w:t>}</w:t>

所以我在这里使用这个正则表达式在{@ 1}}的曲线括号中匹配该文本,这将返回:

\\{([^\\{])*\\}

现在在我的Word文档中,我有类似的内容:{</w:t> </w:r> <w:proofErr w:type="spellStart" /> <w:r w:rsidRPr="009664EA"> <w:t>SOCIETE.RaisonSociale</w:t> </w:r> <w:proofErr w:type="spellEnd" /> <w:r w:rsidRPr="009664EA"> <w:t>}

这将产生:

{LigneDetails.Libelle:FAM:01}

然后正则表达式将匹配部分:

<w:t>{</w:t>
    </w:r>
    <w:proofErr w:type="spellStart" />
    <w:r w:rsidRPr="002A51DD">
       <w:rPr>
          <w:sz w:val="14" />
          <w:szCs w:val="20" />
       </w:rPr>
       <w:t>LigneDetails.Libelle:FAM</w:t>
    </w:r>
    <w:proofErr w:type="spellEnd" />
    <w:r w:rsidRPr="002A51DD">
       <w:rPr>
          <w:sz w:val="14" />
          <w:szCs w:val="20" />
       </w:rPr>
       <w:t>:01}</w:t>

直到现在一切都很好。

现在我想匹配{</w:t> </w:r> <w:proofErr w:type="spellStart" /> <w:r w:rsidRPr="002A51DD"> <w:rPr> <w:sz w:val="14" /> <w:szCs w:val="20" /> </w:rPr> <w:t>LigneDetails.Quantite:FAM</w:t> </w:r> <w:proofErr w:type="spellEnd" /> <w:r w:rsidRPr="002A51DD"> <w:rPr> <w:sz w:val="14" /> <w:szCs w:val="20" /> </w:rPr> <w:t>:01} 之后的最后两个值,在我的情况下是:FAM所以我希望这个正则表达式返回这两个值

我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果我们考虑您当前的方法,您将留下一些{...}个字符串,您可以在其中拥有<...>个实体或文字或{开头且}最后你可以用正则表达式删除。然后,您需要抓取线条并使用:分割,或使用正则表达式获取:符号后的所有非空格字符。

示例Java代码:

String str = "{</w:t>\n                  </w:r>\n                  <w:proofErr w:type=\"spellStart\" />\n                  <w:r w:rsidRPr=\"002A51DD\">\n                     <w:rPr>\n                        <w:sz w:val=\"14\" />\n                        <w:szCs w:val=\"20\" />\n                     </w:rPr>\n                     <w:t>LigneDetails.Quantite:FAM</w:t>\n                  </w:r>\n                  <w:proofErr w:type=\"spellEnd\" />\n                  <w:r w:rsidRPr=\"002A51DD\">\n                     <w:rPr>\n                        <w:sz w:val=\"14\" />\n                        <w:szCs w:val=\"20\" />\n                     </w:rPr>\n                     <w:t>:01}"; 
str = str.replaceAll("<[^<]*?>|^\\{|\\}$", "");
String[] lines = str.split("\n");
List<String> lst = new ArrayList<>();
for (String s : lines) {
    if (s.contains(":"))
        lst.add(s.trim().split(":")[1]);
}
System.out.println(lst);

请参阅Java demo

或者带有:(\S+)正则表达式的版本从剥离的字符串内容中抓取1个以上的非空白块:

str = str.replaceAll("<[^<]*?>|^\\{|\\}$", "");
Matcher m = Pattern.compile(":(\\S+)").matcher(str);
List<String> lst = new ArrayList<>();
while (m.find()) {
    lst.add(m.group(1));
}

请参阅another demo