2010-12-03 25 views
2

通常はです。は、(?s)フラグを使用してエンジンを指定しない限り、改行にマッチしません。私は、Perlスタイルの正規表現モードを使用して、私の編集者(ウルトラv14.10)正規表現エンジン上でこの正規表現を試してみました:ドットマッチオールモードを使用した正規表現

(?s).*i 

検索テキストを複数行に含まれており、各行は、多くの「I」の文字が含まれています。

私は上記の正規表現の手段を期待:できるだけ多くの文字を検索 '文字に到達するまで(理由*のための貪欲の)可能性として(。なぜならと「?は今、改行を含むものと一致しました)私'。

これは、「最後の文の最初の文字から最後の 'i」を意味するはずです(最後の文には貪欲があるはずですか?)。

しかし、UltraEditのテストでは、最初の文字から最後の 'i'までの最初の文にiが含まれています。この結果は正しいですか?私のreg式の間違った解釈をしましたか?

このテキスト

aaa 
bbb 
aiaiaiaiaa 
bbbicicid 

与えられ、それがマッチした

aaa 
bbb 
aiaiaiai 

です。しかし、私は期待しています:

aaa 
bbb 
aiaiaiaiaa 
bbbicici 

答えて

5

あなたの正規表現は正しいので、あなたの期待通りです。

これは、UltraEditの正規表現の実装の中で、私が繰り返しサポートするために書いた長い間知られているバグです。私が知る限り、まだ修正されていません。この問題は、UEの正規表現の実装が基本的に行ベースであり、必要な場合にのみ追加の行が一致に取り込まれるという事実にあるように見えます。したがって、.*は現在の行でgreedilyと一致しますが、一致を達成する必要がない場合は改行境界を超えません。

その他の微妙なバグがあります。たとえば、lookbehindは改行をまたいで動作しません。

IDMサポートに書き込むか、まともな正規表現をサポートするエディタに変更してください。私は両方をしました。

+0

あなたが言及したlookbehindのバグについてはわかりません。しかし、入力ファイル全体を貪欲に調べるのが遅すぎて、このように振る舞いを変えることはできないのだろうか? UltraEditでは、MBの入力ファイルのサイズを編集できることを覚えておいてください。 – JavaMan

+0

EditPadProはGBのファイルを扱い、これらの正規表現の制限はありません。欲張りな正規表現を作れば、正しく動作すると思っています。これはメモリ不足を意味する場合は、それは私の問題やOSですが、エディタは私を推測してはいけません。 –

1

はい、これはバグのようです。

あなたの解釈は正しいです。あなたがPerlモードでPosixではない場合。 ただし、posixにも適用する必要があります。

あなたのように修飾語を定義することは非常にまれです。

ほとんどあなたは/.*i/s

のように、その後の区切り記号と修飾子の文字列を提供しますが、あなたの方法があまりにも正確であるため、これは重要ではありません。サポートされていなければ、最初の改行にも一致しません。

はい、これは間違いなくあなたのプログラムのバグです。

1

正規表現は文字列全体(すべての4行)と一致する必要があります。私の推測では、UltraEditは、行ごとに作業し、「必要なときに」新しい行だけを蓄積することによって、何らかの最適化を試みているということです。

+0

バグではない場合、私はこれが行動をこのように変更した理由であると思います。おそらく、テキストエディタの場合、ファイル全体を貪欲に検索するとパフォーマンスが低下します。 – JavaMan

関連する問題