2017-07-12 25 views
0

1つの長い文字列から2つの特定のデータを抽出しようとしています。値の両方が「=」の後ですが、問題は、私はもっぱらちょうど私が必要とするデータの一部が同様にそれらが含まれているため、すべては「=」にデータを分割することはできませんです。複数の文字列解析を1つの文字列に変換しようとしています

以下
example: "{col1=RND393JKDN, col2=DJW//39ndo==8} 
desired format: "RND393JKDN, DJW//39ndo==8" 

がありますコード私はそう修正するために書かれているが、他の作品は、私が入力されますどのように多くの列が不明だということですので、私は次のように列の未知の量を処理できるようにする必要があり:"{col1=value1, col2=value2, col3=value3}"

for(int i = 0; i < finalResult.size(); i+=modval) { 
    //below forces the result to get stored in below variable as a String type 
    String resulttemp = finalResult.get(i).toString(); 

    //below is only for 
    for(int z = 0; z < columnHeaders.size(); z++) { 
     String newStr=finalResult.get(i).replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\{", "").replaceAll("\\}", ""); 

     String newStr2; 
     String newStr3; 

     String find = "="; 

     newStr = (newStr.substring(newStr.indexOf(find)+find.length())); 
     newStr2 = (newStr.substring(newStr.indexOf(find)+find.length())); 
     newStr3 = (newStr2.substring(newStr.indexOf(find)+find.length())); 

     pw.printf("%s\n", newStr, newStr3); 
    } 
} 
+0

多分、col1 =(? [^、] +) '(各列に対して繰り返す)パターンを探し、その後に連結します。 –

+1

replaceAllは正規表現を受け入れます。なぜ、メソッドを連鎖させるのではなく、文字クラスを使用しないのですか? –

+0

@ cricket_007当初私が言いましたようにreplaceAllを利用しましたが、正しく機能していませんでした。これは当時のダクトテープの修正だったので、私の大きな問題を解決するために – dgelinas21

答えて

1

可能な場合は、入力フォーマットを変更することを検討してください。そうでない場合、ここでは素朴で簡単なアプローチです。

import java.util.List; 
import java.util.ArrayList; 



public class HelloWorld 
{ 
    public static void main(String[] args) 
    { 
    String s = "{col1=RND393JKDN, col2=DJW//39ndo==8}"; 
     s=s.substring(1, s.length()-1); //remove {} 
     s.replaceAll(" ", ""); 
     String[] explode = s.split(","); 
     List<String> result = new ArrayList<String>(); 
     for (int i=0; i<explode.length; i++) { 
      String keyAndValue = explode[i]; 
      int at = keyAndValue.indexOf("="); 
      String value = keyAndValue.substring(at+1); 
      result.add(value); 
     } 
     String finalResult = ""; 
     for (String val : result) { 
      finalResult+=val+", "; 
     } 
     finalResult=finalResult.substring(0, finalResult.length()-2); 
     System.out.println(finalResult); 
    } 
} 

基本的に、キー+値トークンに分割し、first = charを見つけてそこから値を取得します。十分に簡単です。予期しない他のフォーマットルールがある場合を除きます。スペースとコンマはキーと値には表示されません。

+0

はい、私の入力は実際にすでに入力されたソースシステムからのものでしたので、私はフォーマットと衛生管理をしません。残念ながらこの回避策は必要です – dgelinas21

+0

colxに空白が含まれていると、コードによってこれらの文字が削除されます。これは、colコンテンツが変更されていなければならない場合、OPの問題かもしれません。 –

+0

入力フォーマットに応じて、OPはより多くの境界と衛生検査を行う必要があります。 – cen

0

ビルドあなた自身のリスト=の位置。必要な数に応じて、部分文字列を作成します(既にこれを行いました)。

+0

値の等号があるときは助けてくれないと思っています –

+0

@kleopi彼はどちらが等しいかを知ることができませんもし彼がちょうどそれを行うならば、値 – Nathan

0

私はカンマで元の文字列を分割したい、そして=の前で何置き換える:

public static void main(String[] args) { 
    String f = "{col1=RND393JKDN, col2=DJW//39ndo==8}"; 
    String[] fs = f.replaceAll("^\\{|}$", "").split(","); 
    String[] res = new String[fs.length]; 

    for (int i = 0; i < fs.length; i++) { 
     res[i] = fs[i].replaceAll("\\s?col\\d+=", ""); 
    } 
    System.out.println(String.join(", ", res)); // RND393JKDN, DJW//39ndo==8 
} 
1

正規表現はすばらしいことです。ここでは、Javaの組み込みのMatcherクラスとPatternクラスを使用して、必要なものを簡単に行う方法の例を示します。

public static void main(String[] args) 
{ 
    String input = "{col1=RND393JKDN, col2=DJW//39ndo==8}"; 
    //Remove the {} 
    str = str.substring(1, str.length() - 1); 
    //Match "col", then any number, then an = sign, 
    //then capture everything from the = to the , as "content" 
    Pattern p = Pattern.compile("col\\d+=(?<content>[^,]+)"); 
    Matcher m = p.matcher(str); 
    //The target string. 
    String out = ""; 
    //While a match for the pattern exists, i.e. do for all matches of the pattern. 
    while (m.find()) 
    { 
     //String together desired parts into the output string, separated by ", " 
     out += m.group("content") + ", "; 
    } 
    //Remove trailing ", " 
    out = out.substring(0, out.length() - 2); 
} 
関連する問題