1

分割しようとしている JavaScript 文字列がありますが、返された配列の先頭に空の要素があり、その理由がわかりません。

var split_in_el = in_el.split(/(#|\.|\[)/);

ここで、split_in_el はfirst#last、または のいずれか[color:red]です。

私が取得している返された配列(Node.jsでは、問題ではありません)は

.first //split_in_el
[ '', '.', 'first' ] //返される
#last //split_in_el
[ '', '#', 'last' ] //返される
[色:青] //split_in_el
[ '', '[', 'color:blue]' ] //返される

これは、問題を示す jsfiddle です。

4

1 に答える 1

3

これはsplit()一般的にどのように機能するかです。ドットで次のものを分割しているとしましょう.:

Hello.World
     ^
----- -----

返される配列は次のようになります["Hello", "World"]

前の行が次のような場合はどうなるでしょうか。

    .World
    ^
  -- -----

次に、次のような配列を取得します。この["", "World"]メソッドsplit()は、ドットの前の.すべてと の後のすべてを返します。.ドットの前には何も存在しない.ため、空の string が返されます""

より大きな例では:

.Hello.World.From.

次のように返されます: ["", "Hello", "World", "From", ""].

あなたの状況で紛らわしい部分は、空の文字列を取得する方法ではなく、結果の配列で分割している文字をどのように取得するかです。

たとえば、 では.ドットの周りを分割するとドット..firstあり、 では#ポンド記号の周りで分割するとポンド記号が存在##lastます。

これは、メソッドのドキュメントsplit()を見ると明らかになります。

separator がキャプチャ用の括弧を含む正規表現である場合、separator が一致するたびに、キャプチャ用の括弧の結果 (未定義の結果を含む) が出力配列に結合されます。

あなたの場合のセパレーターは、キャプチャグループ内のドット、ポンド記号、またはコロンのいずれか/(#|\.|\[)/に一致する(または分割する)正規表現であるため、結果の配列に追加されます。.#:

/(#|\.|\[)/
 ^       ^
 ---------
 These parentheses are used to create the capturing group

次のように、キャプチャ グループを非キャプチャ グループに変換することで、これを解決できます。

/(?:#|\.|\[)/
  ^^
Notice the syntax

最後に 1 つ付け加えておきたいことが.firstあります。 のような状況では、#lastおそらく を使用したくないのですが、特定のパターンを使用して特定の一致を探したい場合です。split()RegExp.exec()String.match()

たとえば、次の.ような文字の後の単語を取得する場合は、次のよう.firstにします。

var matches = ".first".match(/\.\w+/);
于 2013-10-19T11:30:30.990 に答える