これは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+/);