行頭が数字以外の行を消したいNo.26932
magicoflove さん 09/08/15 03:45
 
 秀丸エディタVersion 7.11、HMJRE.DLL V2.04 を使用しています。

 下記上のような4行のテキストファイルから、数字以外で始まる行を空行に置換し
ようと思い、検索文字列を「^[^0-9].*」、置換文字列を「」(なし)に設定したので
すが、3行目のx だけからなる行は削除されませんでした(下記下のようになりました。
このとき、カーソルは変換後の2行目の一番左のx の右側にあります)。

置換前
>11111
>
>xxxxx
>[EOF]

置換後
>11111
>xxxxx カーソルは左端のx の右側
>[EOF]

 11111 とxxxxx の間にもう1行空行を入れると、所望の動作となります。

 正規表現の指定が間違っているのでしょうか。

[ ]
RE:26932 行頭が数字以外の行を消したいNo.26933
h-tom さん 09/08/15 09:54
 

h-tom です。

> 秀丸エディタVersion 7.11、HMJRE.DLL V2.04 を使用しています。
>
> 下記上のような4行のテキストファイルから、数字以外で始まる行を空行に置換し
>ようと思い、検索文字列を「^[^0-9].*」、置換文字列を「」(なし)に設定したので
>すが、3行目のx だけからなる行は削除されませんでした(下記下のようになりました。
>このとき、カーソルは変換後の2行目の一番左のx の右側にあります)。
<省 略>
> 正規表現の指定が間違っているのでしょうか。
正規表現の指定自体は間違っていませんよ。

置換する場合、通常は、「マッチした位置 + 置換文字数」が、次の検索開始
位置になります。
今回の場合、置換文字数がゼロなので、「マッチした位置 + 1」になります。

説明用に、データを横並びにします。
・データの上の数字が文字数
・データの下の"*"が、マッチした位置
・データ中の"\n"が改行
・データの下の"|"が検索開始位置

1)先頭から検索を始めると、6文字目にマッチするので、6文字目が削除されます。
 12345 6 78901
 1111\n\nxxxx\n
 |     *
 
2)6文字目が削除されたデータの、7文字目から次の検索が始まりますが、
 行頭ではないので、マッチしません。
 12345 678901
 1111\nxxxx\n
        |(検索開始位置)

という理由だと思います。

数字以外で始まる行を空行にしたいなら、
検索:^[^0-9\n].*\n
置換:\n
にしたほうが、いいかもしれません。

[ ]
RE:26933 行頭が数字以外の行を消したいNo.26934
magicoflove さん 09/08/15 16:04
 
>今回の場合、置換文字数がゼロなので、「マッチした位置 + 1」になります。

 この動作については知りませんでした。また、提案いただいた方法で
所望の動作を実現することができました。

 ありがとうございます。

[ ]
RE:26934 行頭が数字以外の行を消したいNo.26936
秀丸担当 さん 09/08/17 11:08
 

この件について調べてみたところ、置換文字列が空で、検索文字列に「^」がある
場合は、ループしてしまわないようにh-tomさんの言われているように1つ進むよ
うになっていました。
例えば、以下のようなテキスト
aaaaa
aaaaa
aaaaa
で、「^a」を「a」に全置換する場合は行頭の一文字目だけを削除するようにする
ためです。
h-tomさんの言われている方法で回避できるということで、現状ではその回避方法
でお願いします。
現在開発中のV8.00βではこの場合でもできるように対策を検討したいと思います。

[ ]