[8157] ある連続した奇数個の文字列を偶数個に置換したいのですが…… 
2016/7/29 (金) 15:03:24 通りすがれ
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.42 (Edition beta)
 はじめまして。
 ファイル中の特定の連続した文字列が奇数個の場合、それを偶数個に置換したいのですが、そのような置換ができるでしょうか?
 正規表現は初歩的なことしかわからないので、参考になるものがないか探してみましたが、見つけられませんでした。
 ここで質問してもよいものかどうか解りませんが、どなたかわかる方がおられましたら、よろしくお願いします。


[8158] Re:ある連続した奇数個の文字列を偶数個に置換したいのですが…… 
2016/7/29 (金) 15:11:24 通りすがれ
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.42 (Edition beta)
 すみません。補足します。
 偶数個の文字列は一行中に何カ所もある場合があります。
 そういった場合でも対応できればありがたいです。
 もしくは奇数個の文字列を偶数個に置換する方法を、偶数個の文字列がなくなるまで何度も繰り返せば大丈夫な気もしますが……。


[8159] Re2:ある連続した奇数個の文字列を偶数個に置換したいのですが…… 
2016/7/30 (土) 04:44:36 もか
Mozilla/5.0 (Windows NT 6.3; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0
▼ 通りすがれさん
>  もしくは奇数個の文字列を偶数個に置換する方法を、偶数個の文字列がなくなるまで何度も繰り返せば大丈夫な気もしますが……。
混乱しているみたいですけど、奇数個の文字列を偶数個にして、奇数個の文字列がなくなるまで…
の誤記だと思います。

正規表現で、最初に偶数個にマッチさせて、その後ろに1個マッチすれば、それは奇数のはずです。
(ABCABC)*(ABC) → $&$2
これだけでもできる、と思たけど無理でした。
前後がマッチしないことが必要みたいですね。
(?<!ABC)(ABCABC)*(ABC)(?!ABC) → $&$2

難しいことをするには、jsマクロのほうが楽かもしれません。
文字列というのが長さが可変長の正規表現の場合は難しいですが、応用すればできなくもないと思われます。
//replace.js みたいな名前で保存
Editor.SelectAll();
var s = Editor.GetSelectedString();
// 大文字小文字を区別しないなら/(ABC)+/ig
s = s.replace(/(ABC)+/g, function(x){
    if (x.length % 6 == 3){ // ←長さの2倍と1倍の数を指定
        return x + x.substr(x.length - 3,3); ←長さは1倍の数を指定
    }
    return x;
});
Editor.InsText(s);

それか単純な文字列なら3回全置換する。
ABCABC → [マーカー] に置換
ABC → [マーカー] に置換
[マーカー] → ABCABC に置換

単純じゃない場合は[マーカーAB/C/AB/C]みたいにして分割して記憶して後で戻すなど工夫が必要。
正規表現で
(AB)(C)(AB)(C) → [マーカー$1/$2/$3/$4]
(AB)(C) → [マーカー$1/$2/$1/$2]
\[マーカー([A-Z]{2})/([A-Z])/([A-Z]{2})/([A-Z])\] → $1$2$3$4


[8160] Re3:ある連続した奇数個の文字列を偶数個に置換したいのですが…… 
2016/7/30 (土) 05:50:04 通りすがれ
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.42 (Edition beta)
 もかさん、返信と助言をありがとうございます。
 すみません、何がしたいのかを具体例を書くべきでした。ちょっと混乱気味だったのも申し訳ありませんでした。

 目的としているのは、複数のテキストファイル中にある『三点リーダ(…)』の調整です。
 小説なんかでは三点リーダは二個セットで使うのが正しいようなので、奇数個の連続した三点リーダを、偶数個の連続した三点リーダに置き換えたいのです。

 例えば、
『…なるほど?』
 のように一行中に一箇所しかない該当箇所がない場合や、一行中に複数の該当箇所がある場合もあります。

 これらを手作業で修正するのは非常に困難かつ時間が掛かる上に、確実性もあやふやになりそうなので、正規表現を使って置換できれば、と考えたのですが……。
 他の簡単な置換作業ではヘルプを見ながらそれっぽい動作を実現できたのですが、今回質問した目的は私の覚束ない知識とスキルでは難しいので、どなたかに知恵を拝借しようと思った次第です。

 お手数をおかけして申し訳ありませんが、よろしくお願い致します。


[8161] Re4:ある連続した奇数個の文字列を偶数個に置換したいのですが…… 
2016/7/30 (土) 06:20:21 もか
Mozilla/5.0 (Windows NT 6.3; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0
※午前5時台に返信があると思わなかったので、元返信を一部修正しています。
了解しました。三点リーダーを置換する場合も書いておきます。
ここでは 置換前 → 置換後 という意味の矢印です。

三点リーダーなら3つめの方法、全置換3回で何とかなると思います。

…… → *
… → *
* → ……

これで、奇数の場合は1つ…を増やして偶数個になります。
「*」は文章中に出ない文字列なら何でも構いません。
「※目印」とか「xxxx」とかでもいいです。

奇数個の三点リーダーを検索、強調表示、一度に置換したいなら、以下の正規表現をコピペして使ってください。
否定戻り読み、否定先読みを使っています。前後が…でないという意味です。
置換後の$&はマッチ文字列全体を表します。

(?<!…)(……)*(…)(?!…) → $&…

なお、ご存知かもしれませんが、小説の三点リーダーのチェックは、「ノベルチェッカー」という複数あるサイトで確認ができますので、それを使うのも便利です。
サクラでは上の呪文を正規表現キーワードに//kで囲って登録すると、書きながらのチェックもできます。
小説用タイプ別設定
http://sakura.qp.land.to/?Customize%2F%C5%EA%B9%C6%2F84
というのでも、確認できるはずです。


[8162] Re5:ある連続した奇数個の文字列を偶数個に置換したいのですが…… 
2016/7/30 (土) 19:32:38 もか
Mozilla/5.0 (Windows NT 6.3; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0
> …… → *
> … → *
> * → ……
2chに書いてあったように、
…… → …
… → ……
で十分だった。。。

INCM/CMT
Cyclamen v3.81