改行マクロ(複数分岐)No.08277
Lizu01 さん 16/08/24 16:02
 
@ ()が2回以上連続して続く場合下記のようにしたいです。
  ※ ) と ( の間に何もない場合

変換前---------------------------------------------------
ああああ(ああああああああ)(あああああああああ)ああああ
---------------------------------------------------------

変換後---------------------------------------------------
ああああ

(ああああああああ)
(あああああああああ)

ああああ
---------------------------------------------------------


A ()で囲まれた折り返し行が7行以上の場合、
  ()で囲まれた文字数を半分で割った数に一番近い句点(。)で改行


変換前---------------------------------------------------
1行目 (ああああ。あああああああ
2行目 あああああ。あああああああ
3行目 あああああ。あああああああ
4行目 あああああ。あああああああ
5行目 あああああ。あああああああ
6行目 あああああ。あああああああ
7行目 あああああ。あああああああ)
---------------------------------------------------------

変換後---------------------------------------------------
1行目 (ああああ。あああああああ
2行目 あああああ。あああああああ
3行目 あああああ。あああああああ
4行目 あああああ。
5行目
6行目 ああああああああああああ。
7行目 ああああああああああああ。
8行目 ああああああああああああ。
9行目 あああああああ)
---------------------------------------------------------

何卒ご教示よろしくお願いいたします。

[ ]
RE:08277 改行マクロ(複数分岐)No.08278
秀まるお2 さん 16/08/24 17:47
 
 サイトー企画の斉藤秀夫です。

> @ ()が2回以上連続して続く場合下記のようにしたいです。
>   ※ ) と ( の間に何もない場合

 検索: ([^\(\)]+)\(([^\(\)]+)\)\(([^\(\)]+)\)([^\(\)]+)$
 置換: \1\n\n(\2)\n(\3)\n\n\4

 でいけるかと思います。

 マクロだと、

    replaceallfast
        "([^\\(\\)]+)\\(([^\\(\\)]+)\\)\\(([^\\(\\)]+)\\)([^\\(\\)]+)$"
        , "\\1\\n\\n(\\2)\\n(\\3)\\n\\n\\4", regular;

 ってな具合になります。

 もう1つは別発言にて。

[ ]
RE:08277 改行マクロ(複数分岐)No.08279
秀まるお2 さん 16/08/24 17:49
 
> A ()で囲まれた折り返し行が7行以上の場合、
>   ()で囲まれた文字数を半分で割った数に一番近い句点(。)で改行

 なんか大作になってしまいました。

 とりあえずサンプルではうまく動いてるようです。


    setcompatiblemode 0x00000100;
    gofiletop;

    while(1) {
        searchdown "^\\((?=.*。).*\\)$", regular;
        if( !result ) {
            //message "not found";
            break;
        }
        golinetop2;
        #ytop = y;
        golineend2;
        #yend = y;
        if( #yend - #ytop + 1 < 7 ) {
            //7行でなければ対象外。
            //message "#yend - #ytop = " + str(#yend - #ytop);
            continue;
        }
        #colMax = column;
        golinetop;
        down;
        beginsel;
        up;
        golinetop2;
        #colNear = -1;
        #linenoNear = lineno;
        while(1) {
            searchdown "。", casesense, inselect;
            if( !result ) {
                break;
            }
            #col = column;
            if( #colNear < 0 ) {
                #colNear = #col;
            } else {
                #diff1 = #colMax / 2 - #colNear;
                if( #diff1 < 0 ) {
                    #diff1 = - #diff1;
                }
                #diff2 = #colMax / 2 - #col;
                if( #diff2 < 0 ) {
                    #diff2 = - #diff2;
                }
                if( #diff2 < #diff1 ) {
                    #colNear = #col;
                }
            }
        }
        escapeinselect;
        if( #colNear >= 0 ) {
            moveto2 #colNear + 2, #linenoNear;
            //message "will insert";
            insert "\n\n";
        }
        //message "next";
    }
    //message "end";

[ ]
RE:08279 改行マクロ(複数分岐)No.08280
Lizu01 さん 16/08/25 14:09
 
>> A ()で囲まれた折り返し行が7行以上の場合、
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>    //message "end";

動作確認致しました。
ありがとうございます。
一文一文勉強させて頂きます。


[ ]
RE:08278 改行マクロ(複数分岐)No.08281
Lizu01 さん 16/08/25 14:16
 
> サイトー企画の斉藤秀夫です。
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
> もう1つは別発言にて。

ありがとうございます。

@あああ(あああ)(あああ)あああ
 @の場合は動作確認致しました。

Aあああ(あああ)(あああ)(あああ)あああ
Bあああ(あああ)(あああ)(あああ)(あああ)あああ
 実はAやBのように2回以上続く場合もあるのです。

()が2回以上連続して続く場合でお願いしたいです。
説明が不足しており大変申し訳ありません。




[ ]
RE:08281 改行マクロ(複数分岐)No.08282
秀まるお2 さん 16/08/25 15:03
 
 僕の方もあまり理解してませんでした。

 AやBでもうまく置換出来るような正規表現の置換を1回でやるのは無理があ
ると思うので、3回に分ける作戦にしてみました。

検索: (?<!\))(?<=.)\(
置換: \n\n(

検索: \)\(
置換: )\n(

検索: \)(?!\()(?=.)
置換: )\n\n

 の手順で置換したらいいかと思いました。

    replaceallfast "(?<!\\))(?<=.)\\(", "\\n\\n(", regular;
    replaceallfast "\\)\\(", ")\\n(", regular;
    replaceallfast "\\)(?!\\()(?=.)", ")\\n\\n", regular;

 ってなマクロになりました。

 一応、サンプルではうまく置換するようでした。もっとややこしいケースがあ
るとダメかもしれませんけども。

[ ]
RE:08282 改行マクロ(複数分岐)No.08284
Lizu01 さん 16/08/25 16:08
 
> 僕の方もあまり理解してませんでした。
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>るとダメかもしれませんけども。

動作確認致しました。
ありがとうございます。大変助かりました。



[ ]
RE:08282 改行マクロ(複数分岐)No.08288
Lizu01 さん 16/08/26 09:50
 
> 僕の方もあまり理解してませんでした。
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>るとダメかもしれませんけども。

せっかく作って頂いたのに申し訳ありません。
再度確認した所、
あああ(あああ)あああ も変換される事に気づきました。
あああ(あああ)(あああ)あああ のように()が2回以上連続して続く場合のみ変換し
たいと考えています。





[ ]
RE:08288 改行マクロ(複数分岐)No.08289
秀まるお2 さん 16/08/26 16:47
 
 実際テストするといろいろダメなパターンが見つかってしまうということで・・・

 括弧が2つの場合の置換、3つの場合の置換、4つの場合の置換、の3パターンを
作ってみました。

2つ:
 検索: ([^()]+)\(([^()]+)\)\(([^()]+)\)([^()]+)$
 置換: \1\n\n(\2)\n(\3)\n\n\4

3つ:
 検索: ([^()]+)\(([^()]+)\)\(([^()]+)\)\(([^()]+)\)([^()]+)$
 置換: \1\n\n(\2)\n(\3)\n(\4)\n\n\5

4つ:
 検索: ([^()]+)\(([^()]+)\)\(([^()]+)\)\(([^()]+)\)\(([^()]+)\)([^()]+)$
 置換: \1\n\n(\2)\n(\3)\n(\4)\n(\5)\n\n\6


 マクロにすると、

replaceallfast "([^()]+)\\(([^()]+)\\)\\(([^()]+)\\)([^()]+)$"
        , "\\1\\n\\n(\\2)\\n(\\3)\\n\\n\\4"
        , regular;
replaceallfast "([^()]+)\\(([^()]+)\\)\\(([^()]+)\\)\\(([^()]+)\\)([^()]+)$"
        , "\\1\\n\\n(\\2)\\n(\\3)\\n(\\4)\\n\\n\\5"
        , regular;
replaceallfast "([^()]+)\\(([^()]+)\\)\\(([^()]+)\\)\\(([^()]+)\\)\\(([^()]
+)\\)([^()]+)$"
        , "\\1\\n\\n(\\2)\\n(\\3)\\n(\\4)\\n(\\5)\\n\\n\\6"
        , regular;


 のように非常にややこしくなってしまいました。


--------余談---------------------
   ([^()]+)  を何か分かりやすい表記に置き換えるような正規表現構文を独自に作
ってしまうといいかもしれませんけども。

例えば
  (?#define:z=([^()]+))

 って書くと\zが([^()]+))相当になって、

(?#define:z=([^()]+))\z\(\z\)\(\z\)\z$

 のように表記できるとか・・・。邪道ですかね。

[ ]
RE:08289 改行マクロ(複数分岐)No.08290
山紫水明 さん 16/08/26 17:44
 

これではだめでしょうか。

replaceallfast "(?<!\\))(?=.+\\(.+)\\(", "\\n\\n(", regular;
replaceallfast "\\)(?<=.+\\).+)(?!\\()", ")\\n\\n", regular;
replaceallfast "\\)\\(", ")\\n(", regular;

                   山紫水明

[ ]
RE:08290 改行マクロ(複数分岐)No.08291
山紫水明 さん 16/08/26 21:00
 

2行でも行けそうです。

replaceallfast "(?<!\\))(\\(.+\\(.+\\))(?!\\()", "\\n\\n\\1\\n\\n", regular;
replaceallfast "\\)\\(", ")\\n(", regular;

                    山紫水明

[ ]
RE:08289 余談No.08292
h-tom さん 16/08/26 23:18
 

h-tom です。

>--------余談---------------------
>   ([^()]+)  を何か分かりやすい表記に置き換えるような正規表現構文を独自に作
>ってしまうといいかもしれませんけども。
>
>例えば
>  (?#define:z=([^()]+))
>
> って書くと\zが([^()]+))相当になって、
>
>(?#define:z=([^()]+))\z\(\z\)\(\z\)\z$
>
> のように表記できるとか・・・。邪道ですかね。

鬼車/鬼雲 には、 「部分呼び出し」という機能があります。
(?<z>[^()]+)\(\g<z>\)\(\g<z>\)\g<z>$
------------  -----    -----  -----
(1)           (2)      (3)    (4)

(1) "z" という名前でグループ化 (?<name>regexp)
(2)〜(4) "z"を呼び出し。        \g<name>

hmonig.dllでも使用できますが、デフォルト仕様(*1)では、括弧によるグループ化と、
名前付きグループ化が同時使用できない事もあり、置換だとキャプチャがうまくいき
ません。(*2)

(*1)正規表現のコンパイル時に変更可能。
(*2)名前付きを使うと、番号による読み出しができない。
    また、結果的に名前の多重定義になり、最大部分(例では(4)部分)しか、名前付き
    でも読み出せない。
    (ライブラリの仕様)

ということで、特に「邪道」という事は無いと思います。
まぁ、表記方法をどうするかが、一番の問題かな?

[ ]
RE:08279 改行マクロ(複数分岐)No.08293
Lizu01 さん 16/08/29 10:50
 
>> A ()で囲まれた折り返し行が7行以上の場合、
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>    //message "end";

度々申し訳ありません。
1行80文字折り返しで下記の場合、句点で無い所で改行されるみたいです。
何卒ご確認の程よろしくお願いいたします。

あああああああああああ

「ああああああああ。あああ、ああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああああ
あああああああああああああああああああああああああああああ。ああああああああ
ああああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああ。あああああああああ
ああああああああああああああああああああああああああああああああああああああ
ああああああああ。あああああああああああああああああああああああああああああ
あああああああああああああああ」

ああ

「あああああああああああああああああああああああああああああああああああああ
ああああああああああああああ。あああああああああああああああああああああああ
あああああああああああああああああああああああああああああ。ああああああああ
ああああああああああああああああああああああああ。あああああああああああああ
ああああああああああああああああああああああああああああああああああああああ
あああああああああああああ」









[ ]
RE:08289 改行マクロ(複数分岐)No.08294
Lizu01 さん 16/08/29 10:58
 
> 実際テストするといろいろダメなパターンが見つかってしまうということで・・・
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
> のように表記できるとか・・・。邪道ですかね。

ありがとうございます。
私も同じ事をやろうと思って作っていたら、
\\10を余裕で超えるパターンもあるため断念しておりました。

>   ([^()]+)  を何か分かりやすい表記に置き換えるような正規表現構文を独自に作
>ってしまうといいかもしれませんけども。
なるほど そのような方法も可能なのですね。
勉強になります。



[ ]
RE:08291 改行マクロ(複数分岐)No.08295
Lizu01 さん 16/08/29 11:00
 
>
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>                    山紫水明

素晴らしい。
もっと複雑な構文になると思っていたら、こんなにシンプルに纏める事が出来るので
すね。
大変勉強になりました。

[ ]
RE:08294 改行マクロ(複数分岐)No.08296
秀まるお2 さん 16/08/29 11:14
 
> 私も同じ事をやろうと思って作っていたら、
> \\10を余裕で超えるパターンもあるため断念しておりました。

 僕のやり方だと限界があるようです。

 山紫水明さんの方式がベストかと思います。

[ ]
RE:08292 余談No.08297
秀まるお2 さん 16/08/29 11:20
 
 情報ありがとうございます。

 鬼車の正規表現の説明見てみたんですが、これってタグ付き正規表現の拡張み
たいな感じで、なんだかややこしそうでした。

 僕は単純に、C言語での#defineみたな感じで、単純に同じのを繰り返し書くの
が省略できたらいいかなぁと思っただけでした。

> ということで、特に「邪道」という事は無いと思います。
> まぁ、表記方法をどうするかが、一番の問題かな?

 鬼車さんのとは意味が異なるので、鬼車さんと同じにするのはよろしくなさそ
うです。

 やはり、(?#...)で入れとくのが無難な気がしますけど、とりあえずネタして
保留しようかなぁと思います。

 「\」が勝手に付くんじゃなくて、単純に文字列の置き換えとして動くように
したら、例えば正規表現を見やすくする用に途中に空白で区切ったりできて便利
かなぁと思ったりしました。

 (?#define:文字列1=文字列2)

 って構文で、例えば

 (?#define: =)

 って書けば空白が無視されて、

 (?#define: =)(a+) (b+)

 と書くと、(a+)(b+)と同じ扱いになるとか。空白で区切って分かりやすく表記
できたりしていいかなぁと思ったりしました。

[ ]
RE:08293 改行マクロ(複数分岐)No.08298
秀まるお2 さん 16/08/29 11:41
 
 このサンプルは

> A ()で囲まれた折り返し行が7行以上の場合、

 って条件に合わないように思います。先頭が「(」で最後が「)」になってない
ので。マクロを実行しても何も変換してくれないです。

 ここの会議室だとサンプルデータの書き込みがちょっと面倒なので、例えば

 http://www.dotup.org/

 にアップロードしてURLだけここに書き込んでいただくといいかもしれません。

[ ]
RE:08297 余談No.08299
秀まるお2 さん 16/08/29 11:46
 
 ついでに・・・

 C#では、「\」を含む文字列を、

    @"\n"

 みたいに記述できる方法があって、秀丸エディタのV8.66βでヒアドキュメン
ト的書き方に対応したってことなので、ついでにこっちも対応してくれってお願
いしときました。(秀丸担当に)

 「\」入りのややこしい正規表現が多少書きやすくなると思います。

[ ]
RE:08298 改行マクロ(複数分岐)No.08300
Lizu01 さん 16/08/29 13:22
 
> このサンプルは
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
> にアップロードしてURLだけここに書き込んでいただくといいかもしれません。


すみません。焦って記号を間違えておりました。
下記urlにデータをアップ致しました。

http://www.dotup.org/uploda/www.dotup.org987542.zip.html

中身は「」を()に置き換えただけです。

[ ]
RE:08300 改行マクロ(複数分岐)No.08301
秀まるお2 さん 16/08/29 14:51
 
 マクロにバグがありました。

 searchdownで「inselect」を指定するのを2回連続実行すると、2回目は範囲
選択されてない状態に戻ってるせいで、選択範囲を超えてヒットしてしまうよう
でした。

 連続検索する場合はfinddownにしないといけないようです。

 そういう風に直してみました。(#firstって変数の処理が改良点)

    setcompatiblemode 0x00000100;
    gofiletop;

    while(1) {
        searchdown "^\\((?=.*。).*\\)$", regular;
        if( !result ) {
            //message "not found";
            break;
        }
        golinetop2;
        #ytop = y;
        golineend2;
        #yend = y;
        if( #yend - #ytop + 1 < 7 ) {
            //7行未満は対象外。
            message "#yend - #ytop + 1 = " + str(#yend - #ytop + 1);
            continue;
        }
        #colMax = column;
        golinetop;
        down;
        beginsel;
        up;
        golinetop2;
        #colNear = -1;
        #linenoNear = lineno;
        #first = 1;
        while(1) {
            if( #first ) {
                #first = 0;
                searchdown "。", casesense, inselect;
            } else {
                finddown;
            }
            if( !result ) {
                break;
            }
            #col = column;
            if( #colNear < 0 ) {
                #colNear = #col;
            } else {
                #diff1 = #colMax / 2 - #colNear;
                if( #diff1 < 0 ) {
                    #diff1 = - #diff1;
                }
                #diff2 = #colMax / 2 - #col;
                if( #diff2 < 0 ) {
                    #diff2 = - #diff2;
                }
                if( #diff2 < #diff1 ) {
                    #colNear = #col;
                }
            }
        }
        escapeinselect;
        if( #colNear >= 0 ) {
            moveto2 #colNear + 2, #linenoNear;
            //message "will insert";
            insert "\n\n";
        }
        //message "next";
    }
    //message "end";

[ ]
RE:08301 改行マクロ(複数分岐)No.08302
Lizu01 さん 16/08/29 16:26
 
> マクロにバグがありました。
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>    //message "end";

早速ご対応頂きありがとうございます。
動作確認致しました。
とても助かりました。感謝!!!


[ ]
RE:08291 改行マクロ(複数分岐)No.08305
Lizu01 さん 16/08/29 18:27
 
>
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>                    山紫水明


ありがとうございます。

確認した所以下のようなパターンの場合も変換されてしまうようです。

あああああ(ああああ)と(ああああ)と(ああああ)あああああ。

この場合間に と が入っているため変換しないようにしたいです。

以下のように()の間に何も無い場合のみ変換したいです。

あああああ(ああああ)(ああああ)(ああああ)あああああ

  ↓


あああああ

(ああああ)
(ああああ)
(ああああ)

あああああ







[ ]
RE:08305 改行マクロ(複数分岐)No.08307
山紫水明 さん 16/08/29 20:14
 
 Lizu01さん,

>あああああ(ああああ)と(ああああ)と(ああああ)あああああ。
>この場合間に と が入っているため変換しないようにしたいです。

次のようにしたらいかがでしょう。

replaceallfast "(?<!\\))(\\(.+\\)\\(.+\\))(?!\\()", "\\n\\n\\1\\n\\n",
regular;
replaceallfast "\\)\\(", ")\\n(", regular;

                    山紫水明

[ ]
RE:08307 改行マクロ(複数分岐)No.08309
Lizu01 さん 16/08/30 09:04
 
> Lizu01さん,
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>                    山紫水明

ありがとうございます。

あああああ(ああああ)と(ああああ)と(ああああ)あああああ
の動作確認致しました。


別のパターンもありまして
下記のような場合も可能でしょうか

例1-----------------------------------
(あああ)(あああ)(あああ)あああ(あああ)

  ↓

(あああ)
(あああ)
(あああ)

あああ(あああ)
--------------------------------------

例2-----------------------------------
あああ(あああ)(あああ)あああ(あああ)
  
  ↓

あああ

(あああ)
(あああ)

あああ(あああ)

--------------------------------------







[ ]
RE:08309 改行マクロ(複数分岐)No.08314
山紫水明 さん 16/08/30 18:15
 
 Lizu01さん,

>別のパターンもありまして

 いろいろありますね。
 次のようにしたらいかがでしょう。もしかしたら別の方法があるかもしれませんが。

replaceallfast "(?<!\\))(\\([^)]+\\)\\([^)]+\\))", "\\n\\n\\1", regular;
replaceallfast "(\\([^)]+\\)\\([^)]+\\))(?!\\()", "\\1\\n\\n", regular;
replaceallfast "\\)\\(", ")\\n(", regular;

                    山紫水明

[ ]
RE:08314 改行マクロ(複数分岐)No.08316
Lizu01 さん 16/09/02 16:34
 
> Lizu01さん,
≪全文引用されていたのでコミュニテックス会議室システムが引用部分を省略処理し
ました。≫
>                    山紫水明
返信が遅れてしまい申し訳ありません。

ありがとうございます。
動作確認致しました。とても助かりました。

[ ]