2017-06-22 15 views
1

正規表現を使用して文字列を分割しようとしています。私はnifiで文字列をグループに分割するためにregexを使う必要があります。誰も私は正規表現を使用して文字列の下に分割する方法を助けることができます。文字列をコンマで区切り、コンマを二重引用符で囲まずに正規表現

私はこのような文字列を持っている:私はカンマで分割したいが、私は引用符でカンマを無視する必要が

"abc","-9223371901096288826","/home/test/20170614","abc.com","Hello,Test","7462200","4622012","1296614","1029293","893529","a:ce:o:5:l:p:MMM dd HH:mm:ss","Logs","UTF8","<111>Jun 14 12:43:20 logs: Info: 1497462198.717 13073 1.22.333.44 TCP/200 168 TCP_CONNECT 1.22.33.44:443 ""GO\ABC.COM"" DIRECT/img.abc.com - test_abc_7-DefaultGroup-DefaultGroup-NONE-NONE-NONE-DefaultGroup <IW_adv,3.9,-,""-"",-,-,-,-,""-"",-,-,-,""-"",-,-,""-"",""-"",-,-,IW_adv,-,""-"",""-"",""Unknown"",""Unknown"",""-"",""-"",0.10,0,-,""-"",""-"",-,""-"",-,-,""-"",""-"",-,-,""-""> - -" 


を。

group 1 - abc 
    group 2 - -9223371901096288826 
    group 3 - /home/test/20170614 
    group 4 - abc.com 
    group 5 - Hello,Test 
    group 6 - 7462200 
    group 7 - 4622012 
    group 8 - 1296614 
    group 9 - 1029293 
    group 10 - 893529 
    group 11 - a:ce:o:5:l:p:MMM dd HH:mm:ss 
    group 12 - Logs 
    group 13 - UTF8 
    group 14 - <111>Jun 14 12:43:20 logs: Info: 1497462198.717 13073 1.22.333.44 TCP/200 168 TCP_CONNECT 1.22.33.44:443 ""GO\ABC.COM"" DIRECT/img.abc.com - test_abc_7-DefaultGroup-DefaultGroup-NONE-NONE-NONE-DefaultGroup <IW_adv,3.9,-,""-"",-,-,-,-,""-"",-,-,-,""-"",-,-,""-"",""-"",-,-,IW_adv,-,""-"",""-"",""Unknown"",""Unknown"",""-"",""-"",0.10,0,-,""-"",""-"",-,""-"",-,-,""-"",""-"",-,-,""-""> - - 


私は分割するので、多くの正規表現を試してみましたが、適切な結果を得ることができない:私はこのような何かを発生します。

私は,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)正規表現を試しましたthis linkから試しました。

上記のregexはsplit()関数のJavaでうまく動作しますが、Javaでは使用したくありません。

私は(?<=\")([^,]*)(?=\")正規表現を試して、コンマでグループ内の文字列を分割しましたが、二重引用符で囲んでも分割されています。

誰でも助けてくれますか?前もって感謝します。

+0

あなたのOSは?私はUnixベースの解法を提案できます – RomanPerekhrest

+1

NiFiがキャプチャのリストを取得するオプションを提供しているかどうかわかりませんが、もしそうであれば、分割する代わりに、引用された値をエスケープした引用符を['"((? "" [[^ "]))*)" '](https://regex101.com/r/y5futn/2) –

+0

ドミトリーに感謝します。あなたの提案された表現がうまくいった。 – ankit

答えて

4

次の方法でグループをキャプチャせずに要件を取得できます。

私たちはあなたの以下の文字列を考えてみましょう。、"InputString"という名前の属性で店舗全体の文字列のための

1.Use UpdateAttribute。 updateAttributeの

"abc","-9223371901096288826","/home/test/20170614","abc.com","Hello,Test","7462200","4622012","1296614","1029293","893529","a:ce:o:5:l:p:MMM dd HH:mm:ss","Logs","UTF8","<111>Jun 14 12:43:20 logs: Info: 1497462198.717 13073 1.22.333.44 TCP/200 168 TCP_CONNECT 1.22.33.44:443 ""GO\ABC.COM"" DIRECT/img.abc.com - test_abc_7-DefaultGroup-DefaultGroup-NONE-NONE-NONE-DefaultGroup <IW_adv,3.9,-,""-"",-,-,-,-,""-"",-,-,-,""-"",-,-,""-"",""-"",-,-,IW_adv,-,""-"",""-"",""Unknown"",""Unknown"",""-"",""-"",0.10,0,-,""-"",""-"",-,""-"",-,-,""-"",""-"",-,-,""-""> - -" 

2.After結果、あなたは以下のようにこれらの値を抽出するために、別の更新属性を使用することができます..

group1:${InputString:getDelimitedField(1)} 
group2:${InputString:getDelimitedField(2)} 
group3:${InputString:getDelimitedField(3)} 
group4:${InputString:getDelimitedField(4)} 
group5:${InputString:getDelimitedField(5)} 
group6:${InputString:getDelimitedField(6)} 
group7:${InputString:getDelimitedField(7)} 
group8:${InputString:getDelimitedField(8)} 
group9:${InputString:getDelimitedField(9)} 
group10:${InputString:getDelimitedField(10)} 
group11:${InputString:getDelimitedField(11)} 
group12:${InputString:getDelimitedField(12)} 
group13:${InputString:getDelimitedField(13)} 
あなたはgetDelimitedFunctionは、以下にそれらの値を抽出するための最も簡単な方法です使用することができます

あなたはそれですべての問題に直面した場合、私に知らせて

https://nifi.apache.org/docs/nifi-docs/html/expression-language-guide.html#getdelimitedfield

を参照。

関連する問題