2017-01-06 14 views
3

正規表現を使用して文字列を解析しようとしています。私はコンテンツテキストを持っています:テキストと私はテキストを持っている文字列から内容を解析したい:テキスト。 コード:正規表現を使用して文字列をパースする

String lines=" from:cal_date_d type:string relationship:many_to_one sql_on:${fact_customer.dw_update_date} = ${cal_date_d.dw_update_date}"; 
Pattern p = Pattern.compile("(\"?[\\w ]*)\\:(\"?([\\w]*)\"?)"); 
       Matcher m = p.matcher(lines); 
       while(m.find()) { 
        String Column_Data=m.group(0); 
        System.out.println("Regex:   "+Column_Data); 
       } 

出力リレー:

from:cal_date_d 
type:string 
relationship:many_to_one 
sql_on: 

予想される出力:

from:cal_date_d 
type:string 
relationship:many_to_one 
sql_on:${fact_customer.dw_update_date} = ${cal_date_d.dw_update_date} 
+0

このパターンを試してみてください。より大きな問題は、通常、スペースはキーと値のペアを分離するが、 'sql_on'値の中に入れることができるということである。 'sql_on'の構文は何ですか?それは内部のスペースの前に常に閉じ括弧と等号を持っていますか? 'sql_on'はいつも出現し、最後に現れますか?これをベースにするか、別のアプローチをとるような、他の側面も必要です。 –

+0

Sql_onキーの場合、パターンは同じであり、常にデフォルトである – Navyah

答えて

2

最初の問題は、値が唯一ではない単語文字が含まれている、だけでなく、ドル記号、括弧、等号、ピリオド、スペースことができるということです

([^\s]+(?= ?[^\s]*)?) 

https://regex101.com/r/c0q4W0/2

+1

ありがとうございました。しかし、私は一緒に余分な空の文字列を取得しています。しかし、それは問題ありません、私は文字列の長さをチェックすることによってそれを解析することができます。 – Navyah

+2

@Navyah 0以上の文字( '*')の代わりに1つ以上の( '+')を必要とするように変更するかもしれません。 –

+2

@DavidConradそれは正しいです。それはタイプミスでした。今変更されました – RaR

0

あなたは"key1:value1 key2:value2..."のような文字列を持っているなら、あなたは、この正規表現を使用することができます

([^ ]*:[^ ]*)

+1

しかし、最後の値にスペース(等号の周り)が含まれているため、OPにはそのような文字列はありません。 –

+1

ああ、そうだ。この場合、スペースとは、キーと値のペアの間の区切り文字であり、最後のペアは「=」のまわりにスペースがあるため、解析できません。 –

+0

@Dmitry、以下のパターンを使用してください。結果は次のようになります。cal_date_d タイプ:文字列 関係:many_to_one sql_on:$ {fact_customer.dw_update_date} – Navyah

関連する問題