7

分割式に隣接する区切り文字がある場合、null または空の文字列が予想されますが、削除されません。

Java コードは以下のとおりです。

public class splitter {
    public static void main(String args[]) {
        int size = "||".split("\\|").length;
        assert size == 3 : "size should be 3 and not " + size;
    }
}

{ "", "", "" } または { null, null, null } のいずれかを取得することを期待していました。どちらでもいいです。

空の単語にだまされない正規表現があるのではないでしょうか?

4

2 に答える 2

14

javadocによると:

splitこのメソッドは、指定された式とゼロの制限引数を使用して 2 つの引数のメソッドを呼び出すかのように機能します。したがって、後続の空の文字列は、結果の配列には含まれません。

詳細のjavadoc split(String, int)

パラメータはlimit、パターンが適用される回数を制御するため、結果の配列の長さに影響します。制限nが 0 より大きい場合、パターンは最大n - 1 回適用され、配列の長さはnを超えず、配列の最後のエントリには、最後に一致した区切り文字を超えるすべての入力が含まれます。nが正でない場合、パターンは可能な限り何度でも適用され、配列は任意の長さにすることができます。nがゼロの場合、パターンは可能な限り何度でも適用され、配列の長さは任意であり、末尾の空の文字列は破棄されます。

(私のものを強調)

したがって、空の文字列の配列を返すには、呼び出します"||".split("\\|", -1)

于 2012-07-17T01:26:20.113 に答える
0

ポールの答えを詳しく調べる必要があります (彼の方が単純に見えます) が、アサーションを解決する先読み式について何かを見つけることができました (コードが Apex にあることをお詫びします-Java をラップするだけです)。

static testMethod void testPatternStringSplit() {
        Pattern aPattern = Pattern.Compile('(?=\\|)');
        system.assertEquals(3, aPattern.split('||').size());
        system.assertEquals(3, aPattern.split(' | | ').size());
        system.assertEquals(3, aPattern.split('a|b|c').size());
        system.assertEquals(3, aPattern.split('a|b|').size());
        system.assertEquals(3, aPattern.split('|b|c').size());
        system.assertEquals(3, aPattern.split('|b|').size());
}

ポールをテストするコードを書く必要があります...

于 2012-07-17T02:03:35.550 に答える