2017-02-17 11 views
0

私はfilenameと呼ばれるStringを持っている:ある期間に分割すると二重のバックスラッシュが必要なのはなぜですか?

filename = "z_cams_c_ecmf_20170217000000_prod_fc_pl_015_aermr04.nc"; 

私は変数名aermr04.ncを取得するためにfilenameを分割しようとすると、私は次のことを試してみました:

String varibleName = filename.split("_")[9].split(".")[0]; 

上記のコード行がIndexOutOfBoundsExceptionをスローします。

なぜですか?

私はそれを使って作業をけん引取得することができます。

String varibleName = filename.split("_")[9].split("\\.")[0]; 

しかし、それは私が、このような些細なタスクと周りいじる必要があることを、むしろ愚かなようだ...なぜ第二の例の作品

任意のアイデアを?そのような構文の背後にある理由は何ですか?

+2

として"."正規表現をエスケープする必要がある期間そのため '.'、正規表現では、「任意の文字」を意味します。したがって、リテラル期間は、エスケープする必要があります(例:バックスラッシュ)。しかし、文字列中のバックスラッシュ '\'はエスケープする必要があるので、\ "。\"となります。 – AntonH

+0

@yshavitハ、そうです。私はそれに気をつけてください:) – AntonH

+1

正規表現なしで、または 'String varibleName = filename.substring(filename.lastIndexOf( '_')、filename.lastIndexOf( '。')を使用して、不要な文字列と配列をすべて作成することができます。 )) ''(あなたの文字列中の最後の '_'と' .')を仮定します。 –

答えて

0

.split()の引数は正規表現として扱われます。正規表現としてすべて一致するように"."期間と一致するように

、あなたは"\\."

+1

コードの書式設定を使用すると、二重バックスラッシュが表示されます。 –

関連する問題