2017-09-24 15 views
2

を与える私はいくつかの細胞にGREL式「value.split(/ /)」を適用:Openrefine:正規表現との分割は奇妙な結果に

abcdef -> [ "", "bcdef" ] 
bcdefa -> [ "bcdef" ] 
badef -> [ "b", "def" ] 

最初のセルは私に "を与え、なぜ私が理解できません"要素を作成します。バグですか?

ありがとうございます!

+0

質問:https://github.com/OpenRefine/OpenRefine/issues/1255 –

答えて

1

この機能のためにsource codeにコメントするのにJavaを十分に知らないのですが、according to one of the developers of Open Refineこの動作は正常です(編集:Owenのコメントの詳細、下記参照)。これは、文字列を分割する他の関数がある理由です。 sepが初めにまたは文字列の末尾にあるとき

value.smartSplit(/a/)は、例えば、より一貫した結果を与える:

row value value.smartSplit(/a/) 
1. abcdef [ "", "bcdef" ] 
2. bcdefa [ "bcdef", "" ] 
3. badef [ "b", "def" ] 

これは有効omitfragment = trueオプションでpartition()を使用した場合と同じ結果であります開発者に転送

row value value.partition(/a/, true) 
1. abcdef [ "", "bcdef" ] 
2. bcdefa [ "bcdef", "" ] 
3. badef [ "b", "def" ] 
+2

(REGのEXP付)OpenRefine 'スプリット' 関数は、単にJavaのString」を使用しています分割方法。このメソッドは、 "このパターンと一致する別のサブシーケンスによって終了する入力シーケンスの各部分文字列を含む"配列を生成します。つまり、シーケンスの終結文字として一致したパターンを常に取ります。パターンが文字列の最初の文字と一致する場合、その前の部分文字列は空です。つまり、最初の空の部分文字列です。詳細はhttps://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#split(java.lang.CharSequence,%20int) –

+0

ありがとう!私はvalue.partitionとvalue.smartSplit ... –

+0

これについてもう一度考える... preserveAllTokens = falseでも[""、 "abc"]を持つのは普通ですか? –