2016-09-23 11 views
0

単語文書の一部のテキストと一致する正規表現を作成しようとしています。 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> 

をので、ここで私は、この正規表現を使用して曲がったブラケットとの間にそのテキストを一致:\\{([^\\{])*\\} 、これが返されます:{LigneDetails.Libelle:FAM:01}

これが生成されます:

{</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> 
        </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} 

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

210は、正規表現は部分と一致します。

今、私はので、私は、この正規表現は、これらの2つの値を返すようにしたいFAM01だろういつも私の場合には、:後に来ている最後の2つの値を一致させたいです。

どうすればいいですか?

+0

http://stackoverflow.com/質問/ 1732348/regex-match-open-tags-except-xhtml-self-contained-tags – teukkam

+0

あなたの正規表現が間違っていませんか?あなたは '\ {([^ \ {])* \}'を投稿しました(Javaが必要とする二重エスケープを削除しました)。何か_中括弧_ではない? – Thomas

+1

あなたの要件の問題は、_right_コロン( ':')_reliably_を得ることが非常に難しいことです(regexでXML/HTMLを解析することは難しい作業であり、 XML/HTMLは正規言語ではないため、正規表現はあまりうまく収まりません。 – Thomas

答えて

1

我々は考慮にあなたの現在のアプローチを取る場合、あなたはあなたが正規表現を削除することができます最後に開始し、}<...>エンティティまたはテキストや{を持っているいずれかのいくつかの{...}文字列で残されています。次に、線をつかんで:で分割するか、または正規表現を使用して、:シンボルの後にすべての非空白文字を取得する必要があります。

サンプルJavaコード:

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

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

または剥奪文字列の内容から1+非空白チャンクをつかむ:(\S+)正規表現とバージョンを参照してください。 another demo

関連する問題