2011-10-18 1 views
2

これは私の正規表現です。私は間違っていなければ、POSIXの正規表現を使用するRubyを使っています。ここでRuby正規表現:改行または文字列の先頭で始まる文字列を分割しますか?

regex = /(?:\n^)(\*[\w+ ?]+\*)\n/ 

が私の目標です:私はそれらのアスタリスクを含め*delimited by asterisks*ある正規表現の文字列を、分割したいです。 しかし、:改行文字(\n)が付いているか、それは文字列全体の先頭です。これは私が扱っている文字列です。

"*Friday*\nDo not *break here*\n*But break here*\nBut again, not this" 

私の正規表現は*Friday*試合で適切に分割されていないが、それは*But break here*一致で分割(それはまたhere分割で投げています)です。私の問題は最初のグループのどこかにあると思います。(?:\n^) - それは間違っていることを知っていますし、それを書く正しい方法について完全にはわかっていません。誰かが光を当てることはできますか?ここに私の完全なコードがあります。この中で結果

regex = /(?:\n^)(\*[\w+ ?]+\*)\n/ 
str = "*Friday*\nDo not *break here*\n*But break here*\nBut again, not this" 
str.split(regex) 

>>> ["*Friday*\nDo not *break here*", "*But break here*", "But again, not this"] 

は、私はそれがこれをしたい:

>>> ["*Friday*", "Do not *break here*", "*But break here*", "But again, not this"] 

編集#1:私は私の正規表現と結果を更新しました。 (2011/10/18 16:26 CST)
編集#2:もう一度更新しました。 (16:32 CST)

+0

文字列はこのようですか?または、実際の\ nは別の行ですか? – FailedDev

+0

改行は実際には文字列内にあります。 –

答えて

2

各文字列の先頭に「\ n」を追加するとどうなりますか?これにより、処理がかなり単純化されます。

regex = /(?:\n)(\*[\w+ ?]+\*)\n/ 
str = "*Friday*\nDo not *break here*\n*But break here*\nBut again, not this" 

res = ("\n"+str).split(regex) 
res.shift if res[0] == "" 
res 
=> [ "*Friday*", "Do not *break here*", 
    "*But break here*", "But again, not this"] 

最初の余分な試合は見なければならないが、それほど悪くはない。私は誰かがこれを少し短縮できると思う。

+0

私はこれが最高の作品だと言います。配列の先頭に空白行がありますが、そのことについても説明しています(空のエントリまたはnilエントリを削除する 'Array'拡張メソッドがあります。これは私が使用するものです)。ありがとう、ポール。 –

0

グループ以下の正規表現の1 & 2:

(?:\A|\\n)(\*.*?\*)|(?:\A|\\n)(.*?)(?=\\n|\Z) 

は、あなたの所望の出力が得られます。私はルビーエキスパートなので、自分でリストを作成する必要があります:)

+0

私はこの正規表現を '\ n'のエスケープ文字を削除した後にしか使えませんでした。私は@Paul Rubelのソリューションと一緒に行きましたが、少し難読化されています。 –

+0

@BenjaminKreegerこれは問題ありません。私が言ったように私はルビーを知らない:) – FailedDev

0

改行で分割しないのはなぜですか?あなたの例から、それはあなたが本当にやろうとしていることです。

str.split("\n") 
関連する問題