2012-03-26 6 views
1

Iは\t,で区切られた文字列を持っているが、\tの数は、例えば、固定されていない。Rubyを使って文字列を分割すると、 t + |//と/ [ t +、] /の違いは何ですか?

a=["seg1\tseg2\t\tseg3,seg4"] 

seg2seg3は、二つ\tで区切られています。

は、だから私はそれが正しいanwser印刷

a.split(/\t+|,/) 

によってそれらを分割しよう:

["seg1", "seg2", "seg3", "seg4"] 

をそして私もこの

a.split(/[\t+,]/) 

を試みるが、答えは

です
["seg1", "seg2", "", "seg3", "seg4"] 

なぜルビは別の結果を表示するのですか?

答えて

5

[]内の\t+は、「1つ以上のタブ」を意味するものではなく、「タブまたはプラス」を意味します。 2つの連続するタブが見つかるので、2回に分割され、中央の文字列は空になります。

. + * ?などのような大部分の特殊文字は、一定間隔で配置されたときに「通常」の文字になります。 ^(最初に置かれたときの間隔を無効にする)、\(間隔の外側と同じように次の文字をエスケープする)、](間隔を閉じる、別の[はまた許可されていない)。したがって、[\t+,]は実際には'\t' or '+' or ','を意味します。

不幸にも、私は間隔内でエスケープする必要があるか、必要でない文字の完全なセットについての参照を知らない。疑いの余地は、私はただ確実に逃げることです。いずれにしても、間隔は常に1文字にのみ一致します。何か別のものが必要な場合は、の外側にの間隔を置く必要があります。

+1

[]でエスケープする必要があるすべての文字セットは、あなたが言及しているものです:[] \(例:[\t,]+、行内に2つのカンマも認めている場合は、最初の正規表現は本当に正しいものです)^plus - (位置によって異なる) – pguardiario

+0

真。興味深いのは、 ' - 'は区間外の特殊文字ではなく、内部だけで、他の2つの文字の間にある**ではないことです。そしてそれ以外にも、 '^'は位置に依存して特殊なものでもなくても構いません(最初の文字として間隔を打ち消します;それ以外のところは普通の文字です)。そして最も奇妙な: ']'が最初の文字として許されます - '[] x]'は "x"または "]"にマッチします。それは、私がいつも疑問に思っているときに脱出する多くのコーナーケースのためです... – mgibsonbr

+0

実際には最初の文字として警告が出ますが、それはルビー正規表現でエスケープされることが予想されます。 – pguardiario

関連する問題