マーキング/キャプチャグループ内のマーキング/キャプチャグループは、ほとんど常に予想される結果ではない、未定義の動作を引き起こします。
正しいPerlの正規表現検索文字列は次のようになります。^((?:.+?\r\n){1000})
内側のグループは、括弧を開いた後ため?:
の今ノンマーキンググループです。内部グループは、乗数表現を適用できるようにのみ定義されているため、何かをマークしてはいけません。つまり、スタック上にコピーされた文字列をコピーして、バックリファレンスを介して再利用できます。将来のために
注:
マーキングのグループに適用さ?
、+
、*
、{n}
、{n,}
、{n,m}
のような乗算器は常に間違っています。
.*
(改行文字以外の任意の文字)または.+
(改行文字を除く任意の文字)を使用してPerl正規表現エンジンに開始位置と場所を指定することも重要です末尾の一致する文字。一致する文字の末尾は\r\n
で定義されます。しかし、一致する文字の先頭は検索式では定義されていません。それが私が^
...行の先頭に追加した理由です。 .*
または.+
を使用して検索文字列に一致する文字を開始および終了する必要がない場合、予期しない検索/置換結果が頻繁に発生することがよくあります。
この検索式は、完全にキャリッジリターンとラインフィード、$1
又は\1
を基準にこのブロックをバックアップし、次の行ストリングZZZZZ
にを挿入するために使用することができる使用して1000本のラインに一致します。
ただし、ZZZZZ
は、1000行目の最後に挿入し、次の行頭には挿入しないでください。この検索式が必要です。そのため
:^((?:.*?\r\n){999}.*)$
置き換える文字列、行の先頭に各検索を開始する\1ZZZZZ
か$1ZZZZZ
検索文字列である - 非常に重要なここから999行にマッチします各行に0文字以上0文字以上欲望は1000行目に改行文字を含みますが、改行文字は改行と改行を含みません。 $
は、Perl正規表現エンジンでファイルの終わりにも機能します。したがって、このPerlの正規表現の検索文字列は、たとえば、正確に5000行のファイルの場合にも機能し、最後の行には行終了がありません。
^
はなぜ正しい結果を得るために重要なのですか?
各1000行目の末尾にZZZZZ
を挿入した後、キャリッジリターンと改行直前の1000行目の末尾に現在位置があります。 ^
がなければ、現在の1000番目の行の次の行の先頭ではなく、\r\n
(.*
... 以上)と一致する検索が開始されます。
Mofi、私はちょうどフォローアップの質問があります。あなたはこのコードをまったくテストしましたか?私は私の小さなセット(3.5K)でそれを試して、それは私に同じエラーを与えている。 –
私は、Perl正規表現のReplace Allを100,000行以上のファイルでテストしました。各行はちょうどいくつかの文字を含んでいました。この式はサイズが制限されたスタック上に1000行をプッシュする必要があるため、このメソッドが動作する場合、行の長さに依存します。スタック上にデータをまったくコピーしないマクロまたはスクリプトソリューションを提供することができました。しかし、UltraEditフォーラムでタスクを説明し、サンプルデータを提供し、ファイルを再フォーマットするための最良の方法を探している方が良いでしょう。 – Mofi
ああ、ありがとう。各行は14文字です。例: AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 –