0

巨大なログファイルで大量の変更を実行する際に問題があります。Notepad ++に問題を引き起こしているファイルサイズを除いて、置換に10個を超えるパラメーターを使用すると問題が発生し、最大9個まで正常に機能します。

これらの値が引用符で囲まれ、前後にコンマがあるファイル内の数値を変更する必要があります。."123,456,789,012.999",

この exp を使用して、フォーマットを見つけて次のように置き換えました:
,123456789012.999, (num.value 内に引用符やコンマがないように)

検索に使用される exp は次のとおりです。

([,])(["])([0-9]+)([,])([0-9]+)([,])([0-9]+)([,])([0-9]+)([\.])([0-9]+)(["])([,])

置換する exp は次のとおりです。

\1\3\5\7\9\10\11\13

問題は、パラメーター\11 \13が機能していないことです (例のような文字.999は、変更された値に表示されません)。

質問は、パラメータに制限はありますか?
10を超えると機能しないように思えます。最大9つのパラメーターのみを使用する必要がある短いnum.valuesの場合、検索と置換の文字列は正常に機能します。上記の例では、検索は機能しますが置換は機能しません。変更された値が壊れます。

また、Notepad++ を使用する代わりに、Unix サーバー上のログファイルを直接変更できるかもしれないと思いましたが、正しい perl 構文を構築するには問題がありました。それを手伝ってくれる人はいますか?

4

3 に答える 3

0

自分で少し遊んだ後、後方参照 \11-\99 は notepad++ では無効であるように見えます (正規表現言語では通常省略されるため、これはそれほど驚くべきことではありません)。ただし、改善するためにできることがいくつかあります。この作業を行うために、その正規表現。

まず、より少ないグループを使用するか、代わりに非キャプチャ グループを使用することを検討する必要があります。置換を行うために、その正規表現に 13 個の変数を格納する必要が本当にありましたか? それらの半分も使用していないので、明らかにそうではありません!

簡単に言えば、正規表現からいくつかの括弧を削除するだけです:

[,]["]([0-9]+)[,]([0-9]+)[,]([0-9]+)[,]([0-9]+)[.]([0-9]+)["][,]

そして、次のものに置き換えます。

,\1\2\3\4.\5,

...しかし、それだけではありません! 内部に 1 つしかないのに、なぜ角括弧を使用して「内部のすべてに一致する」と言うのですか?? これらも取り除くことができます:

,"([0-9]+),([0-9]+),([0-9]+),([0-9]+)\.([0-9]+)",

(「.」の前に「\」を追加したことに注意してください。これにより、「何でも」ではなく、リテラルの「.」と一致します。)

また、これは大したことではありませんが、「[0-9]」の代わりに「\d」を使用できます。

これにより、最終的な最適化された正規表現が作成されます。

,"(\d+),(\d+),(\d+),(\d+)\.(\d+)",

そして、次のものに置き換えます。

,\1\2\3\4.\5,
于 2013-07-25T08:41:13.053 に答える
0

常に固定長の桁数を使用している場合、これまで行ってきたことを実行するのは非常に簡単です。あなたの表現は下手に書かれていますが、それは仕事をします。この場合は、Tom Lords answer を見てください。

私はそれを自分で少しいじってみましたが、おそらく 2 つの式を使用することで、はるかに簡単になります。1つで実行する必要がある場合、これは機能しますが、かなり安全ではありません:

(?:"|(\d+),)|(\.\d+)"(?=,)で置き換える\1\2

ライブデモ: http://regex101.com/r/zL3fY5

于 2013-07-25T10:02:41.167 に答える
0

正規表現グループに制限があるかどうかはわかりませんが、ルックアラウンドを使用して 2 つのグループを保存できます。例でいくつかのグループをマージすることもできます。しかし、まず、いくつかの役に立たない文字クラスに乗りましょう

(\.)(")([0-9]+)(,)([0-9]+)(,)([0-9]+)(,)([0-9]+)(\.)([0-9]+)(")(,)

これらのグループをマージできます。

(\.)(")([0-9]+)(,)([0-9]+)(,)([0-9]+)(,)([0-9]+)(\.)([0-9]+)(")(,)
                                        ^^^^^^^^^^^^^^^^^^^^

我々が得る:

(\.)(")([0-9]+)(,)([0-9]+)(,)([0-9]+)(,)([0-9]+\.[0-9]+)(")(,)

ルックアラウンドを追加しましょう:

(?<=\.)(")([0-9]+)(,)([0-9]+)(,)([0-9]+)(,)([0-9]+\.[0-9]+)(")(?=,)

交換品は\2\4\6\8.

于 2013-07-25T08:43:29.140 に答える