2009-07-03 2 views
0
で始まる行のセットと一致する

これは面白いです。私はのソリューションを持っていますが、私はそれを好きではありません。最適正規表現:

目的は、3つのピリオドで始まる行のセットを見つけることです。個々の行ではなく気にしますが、一致する行のすべての行のコレクションです。

... 

...hello 

... 
...hello 
...world 
... 
...wazzup? 
... 

次のように私のソリューションです:

^\.\.\..*(\n\.\.\..*)*$ 

それはすべてのそれらと一致したので、それは私が使用してんだよ例えば、ここでいくつかの試合は(各マッチは空白行で区切られている)ですしかし今、それはちょっと変わって、\.\.\..*パターンを繰り返すように見えます。もっと簡単な方法はありますか?

test your regexを提出する前に、「うまくいく」と提出するのではなく、提出してください。例えば、私が最初に試した次:のみ、それはトリックを行うだろうように私の心の中に見えるにもかかわらず、個々の行を返さ

(^\.\.\..*$)+ 

- 私はちょうど正規表現内部を理解していないと思います。 (そして、私はRubyでこれを実装しているので、^と$を使って行の境界に合わせるためのフラグを設定する必要はありませんでした)

いい答えがありますが、 1つは非常に感謝される - 事前に感謝!

+0

誰もが異なる実装を行ったため、使用する言語を指定する必要があります。 。ネット? perl? JavaScript? – Eric

+5

ちょうど私はたぶん普通のコードを使うだろうと言っています。ほとんどの言語はファイル(etc)を1行ずつ読みやすく、文字列がいくつかの文字で始まることを確認します。 –

+2

Rubyをそこに指定していると確信しています...そうですか? – Matchu

答えて

1

ほとんどの正規表現の実装では、\.{3}を使用して\.\.\.を短くすると、解決方法は\.{3}.*(\n\.{3}.*)*に変わります。

+0

空の行をつかむようにも見えますが、= /:http://regexpal.com/?flags = m&regex = ^%28 \ n * \。{3}。*%29 *%24&input = ... 20%20%20%20%20A%20A%20A%20A%20A%20A%0A%0A%0A%0A ...%0A ...%どの%20isn%27t%20desired%20behavior%20-%20dan! – Matchu

+0

しかし、私は短縮を感謝します - それは第1段階です:D – Matchu

+0

私は今まであなたの要件を完全に把握していませんでした、ごめんなさい。私は短い解決策を考えることができないので、私はそれに応じて私の答えを編集しました。 –

1

あなたが既に持っているものは、すでにシンプルでわかりやすいものです。もっと「巧妙な」RegExpsは非常に遅く、間違いなく読みにくいかもしれないことに留意してください。

((^|\n)\.{3}[^\n]*)+ 

私はRubyのに慣れていないですので、それは返す方法によっては、あなたが「nonmatch」グループに必要になる場合があります一致します:

((?:(?:^|\n)\.{3}[^\n]*)+) 
+0

優れた点:ベンチマークでは、より圧縮された正規表現が速度の約2/3で実行されることが示されています。 私はこの質問に関して今私が何をしているのか分かりません...私は本当に快適にやっていると感じることができる唯一の短縮ですので、私はもう一方をマークすると思います。 "単純な"答え。ありがとう! – Matchu

0

あなたはラインが\nによって終了していると仮定すると、

(^\.\.\..*$)+の解決策にかなり近いですが、+修飾子がグループの外側にあるため、毎回上書きされていて最後の行だけが残っています。外側のグループ:((^\.\.\..*$)+)でラップして、最初のサブダッチを見て内側のものを無視してみてください。 ((^\.{3}.*$)+)

+0

私はBorgarの応答が複雑になることを嫌っていたので、内側のものは無視します。内部グループを一致させないと、それを完全に無視することができます:((?:^ \。{3}。* $)+) –

+0

幸いにも、私はこの場合グループ化に関心がありません。私はサブマッチは必要ありません。私は順番に置き換えるつもりのマッチが必要です:)そのようなグループ化はその解決策の問題ではありませんでした。それはちょうど良いマッチを作ることではなかった。 – Matchu

+0

それで、私は満足しています。しかし、助けてくれてありがとう! – Matchu

1
^([.]{3}.*$\n?)+ 

これは本当にそこに$を必要としない:他の提案と合わせて

+0

パターンの途中で$が何をしていますか? – FMc

+0

'$'は、行の終わりまたは文字列全体の終わりと一致します。それが行末であれば、 '\ n?'改行を消費するので、次の行でマッチングを続けることができます。正規表現の真ん中にある '$'はその重みを引っ張っていますが、最後の部分は重複しています。 –

+0

おそらく私は何か不足していると思うかもしれませんが、正規表現の貪欲さは、行全体が消費されることを確実にするので、両方の$文字をパターンから削除できます:/^([.]{3}.*\n?) + / – FMc