2016-06-24 5 views
0

の他の部分との間の文字列を見つけるために私は間で文字列を抽出し、文字列のすべての部分でのStringBuilderを構築したい。このJavaの正規表現または他の方法では、文字列とその文字列

String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO ; 

のような文字列を持っています正しい順序で。私は抽出した文字列を特定してローカライズする必要があるので、これを行いますが、文字列全体も保持する必要があります。 すべてのこの仕事のための目的は、目的の文字列を抽出することができた私の正規表現があり

XSSFRichTextString xssfrt = new XSSFRichTextString(); // acts like a StringBuilder 
    xssfrt .append("AZERTY"); 
    xssfrt .append("ZA" , font); //extract 1 
    xssfrt .append(" QWERTY OK "); // keep spaces 
    xssfrt .append("NE" , font); //extract 2 
    xssfrt .append("NO"); 

の間の文字列のフォントをExcelシートのセルの後半で全体の文字列を追加し、追加することですが、私にはありません正しい順序ですべての部品とのStringBuilderを構築する方法を知っている:

Pattern p = Pattern.compile("\\<em>(.*?)\\</em>"); 
      Matcher m = p.matcher(value); 
      while(m.find()) 
      { 
       m.group(1); //extracts 
      } 

/はどうもありがとうございまし

答えて

1

あなたは順番にそれを維持するMatcher's appendReplacement(StringBufferのSB、文字列置換)とappendTail(StringBufferのSB)機能を使用することができます。そして、抽出されたStringを格納するリストを持っています。あなたが通りのような何かをする必要があり、この

public static void main(String[] args) throws java.lang.Exception { 
    String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO"; 
    String matchedString = null; 
    List<String> extractedString = new ArrayList<String>(); 
    Pattern p = Pattern.compile("\\<em>(.*?)\\</em>"); 
    Matcher m = p.matcher(s); 
    StringBuffer sb = new StringBuffer(); 

    while (m.find()) { 

     matchedString = m.group(1); 
     extractedString.add(matchedString); 
     m.appendReplacement(sb, matchedString); 
     sb.append(" "); 

    } 
    m.appendTail(sb); 

    System.out.println(sb.toString()); 
    System.out.println(extractedString.toString()); 
} 
Output : 
String buffer = AZERTYZA QWERTY OK NE NO 
List of extracted String = [ZA, NE] 
+0

あなたの答えをありがとう、私は他の部分から抽出された文字列を識別する必要があるため、単純な文字列ではない文字列ビルダーを構築する必要があります – ulquiorra

+0

@ulquiorra私はあなたの問題を解決するかどうかを確認してください。私があなたが扱うことができると思う最初の単語と最初に抽出された文字列の間にはスペースがありません。私はこれらの機能を広範囲に使用していませんが、それがあなたが望むものだと思っていました。 – Ravikumar

+0

ありがとうございます。魅力のように動作します:) – ulquiorra

0
String[] pieces = s.split("<.*?>") 

これは、<>で囲まれたものに文字列を分割します。 あなたのタグが常にemで、その後、あなたが使用できる場合は、次の

String[] pieces = s.split("</?em>") 
+0

ありがとうございました。そして私はどのように文字列を分割して識別することができます他の部分からですか? – ulquiorra

0

ような何か:

プットアウト
 String str = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO"; 
     StringBuilder stringBuilder = new StringBuilder(); 
     String[] parts = str.split("(<\\/?em>)"); 

     System.out.println("parts : "+Arrays.toString(parts)); 

     for(String s:parts){ 
      System.out.println("Part going to append :"+s); 
      stringBuilder.append(s); 
     } 
     System.out.println("StringBuilder : "+stringBuilder.toString()); 
    } 

は次のようになります。

> parts : [AZERTY, ZA, QWERTY OK , NE, NO] Part going to append :AZERTY 
> Part going to append :ZA Part going to append : QWERTY OK Part going 
> to append :NE Part going to append :NO StringBuilder : AZERTYZA QWERTY 
> OK NENO 

UPDATES: -

更新されたコードを確認します。

String str = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO"; 

     //replace word in string which is preceded by <\em> to word:font eg. ZA:font 
     str = str.replaceAll("(\\w+)(?=\\<\\/em\\>)", "$1:font"); 
    // After replace :AZERTY<em>ZA:font</em> QWERTY OK <em>NE:font</em>NO 

     String[] parts = str.split("(<\\/?em>)"); 
// After split : [AZERTY, ZA:font, QWERTY OK , NE:font, NO] 

     XSSFRichTextString xssfrt = new XSSFRichTextString(); 

     for(String s:parts){ 
      //set font according to replace string 
      if(s.contains(":")){ 
       String[] subParts = s.split(":"); 
       xssfrt.append(subParts[0], /**check the subParts[0] and set the font***/); 
      }else{ 
       xssfrt.append(s); 
      } 
     } 
    } 
+0

ありがとうございます。しかし、私はStringBuilderで "ZA"と "NE"を識別する必要があります。私の更新された質問を参照してくださいありがとう:) – ulquiorra

2

簡単な修正は、あまりにも<em>前に文字列に一致するように、別のグループを追加します

Pattern p = Pattern.compile("(.*?)<em>(.*?)</em>"); 
それで

m.group(1)em外の文字列を指し、m.group(2)は内部のものです。

もちろん、em(例ではNO)の外側の最後の文字列は含まれません。だから、あなたは最後のインデックスを覚えておきたいかもしれません。 int end = m.end()、それを取得するs.substring(end)

+0

ありがとうございます:) – ulquiorra