
次の例に似た内容のテキスト ファイルがいくつかあります。
{
{
1,
text1,
text2,
}
}
{
{
52,
text1,
text2,
}
}
{
{
105,
text1,
text2,
}
}
複数のファイルを一括検索して、次のように置き換えるにはどうしたらよいかと思いました。
{
{
17001,
text1,
text2,
}
}
{
{
17052,
text1,
text2,
}
}
{
{
17105,
text1,
text2,
}
}
基本的に、各二重開き括弧の後の最初の数字にそれぞれ 17,000 を加算します。\d\d\d を使用して数字を 17\d\d\d に置き換えようとしましたが、数字ではなく文字の 17ddd が生成されます。助けてください
答え1
2つの問題があります:
- 置換文字列では、
\d
「 」を印刷するだけを意味し、それ以上のものではありません。やなどのd
すべての正規表現の特殊文字は、検索パターンでのみ機能し、置換文字列では機能しません。\d
\w
- @DavidPostill が言ったように、Notepad++ は正規表現の検索/置換で数学演算を行うことができません。
必要な操作を実行するには、次の 3 つのオプションがあります。
- 何らかのプログラム、スクリプト、またはプラグインを使用して、置換を実行します。前述のコメントにあるように、そのバージョンはここでは話題になりません。
- Notepad++ の検索と置換を 3 回使用します。
- 1桁の数字の第1ラウンド、
- 2桁の場合は2ラウンド目、
- 3桁の場合は3ラウンド目。
- Notepad++のバージョン6.0以上をお持ちの場合は、正規表現でPCRE構文を使用することができ、素晴らしい答え@ACR によって、すべてを 1 回のパスで実行できます。
これを 3 パス方式で実行するには、次の手順に従います。必要な対象だけを捕捉するには、検索パターンを変更する必要がある場合があります。上記のサンプルでは機能しますが、ファイルはサンプルよりも複雑である可能性があります。
1ラウンド
これを見つけてください:
(\s+)(\d),
これを次のように置き換えます:
\11700\2,
第2ラウンド
これを見つけてください:
(\s+)(\d\d),
これを次のように置き換えます:
\1170\2,
第3ラウンド
これを見つけてください:
(\s+)(\d\d\d),
これを次のように置き換えます:
\117\2,
何をするのか
Find this
パターンでは、\s+
次のトークンの前にあるすべての空白文字を検索します。空白文字以外の文字に続く数字とマッチしないようにするには、少なくとも 1 つの空白文字が必要です。 を()
囲む により、マッチによって返される最初のキャプチャ文字列になります。 は\d
1 つの数字にマッチし、 と は\d\d
、\d\d\d
代わりに 2 桁または 3 桁の数字と正確にマッチします。 は、()
これをキャプチャ グループに変換します。今回は 2 番目です。最後に、 は,
数字の後のカンマにマッチし、サンプル ファイル内の同じ行に保持されます。
ではReplace with this
、 は\1
最初のキャプチャ グループ (スペース) に置き換えられます。1700
、170
、 は、17
行に追加する必要がある部分を出力します。 は、\2
検索パターンにある数字である 2 番目のキャプチャ グループに置き換えられます。 最後に、コンマは,
、キャプチャ グループを無駄にするのではなく、明示的に置き換えられます。
答え2
これは、1 回の検索と置換で実現できます。Notepad++ では、グループが一致したかどうかに基づいて条件付き置換を行うことができます。
検索対象:
^(\s*)(\d{3})?(\d{2})?(\d{1})?(,\s*)$
と置換する:
$1(?{2}17$2)(?{3}170$3)(?{4}1700$4)$5
検索式の説明
外側から内側へ進んでいきます。
- および文字
^
は$
それぞれ行の始まりと終わりを示します。 - は
(\s*)
先頭の空白と一致し、(,\s*)
は行末のカンマと末尾の空白と一致します。 - 中央には、3、2、または 1 桁の数字 (構文を使用
{n}
) に一致する 3 つの異なるグループがあります。各グループの後には、?
一致しない可能性があることを示す が続きます。グループは出現順に一致するため、グループの順序は重要です。数字が 3 桁の場合、最初のグループが一致し、次の 2 つのグループが一致する数字はなくなります。数字が 2 桁の場合、最初のグループは一致せず、2 番目のグループは一致しますが、最初のグループには一致する数字がありません。
置換式の説明
- and
$1
は、$5
行の先頭の空白と行末のカンマおよび空白に一致します。 - 次のグループ (逆の順序でリストされています) は、検索式で一致したグループに基づいて、「17」と正しい数のゼロを追加します。たとえば、最初のグループを取ります
(?{2}17$2)
。?{2}
は、グループ 2 が一致したかどうかを確認します。一致した場合は、次のテキストを挿入します: 「17」と、グループ 2 の一致 (3 桁の数字である必要があります)。