我尝试创建一个正则表达式来匹配我的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
所以我希望这个正则表达式返回这两个值
我该怎么做?
答案 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