アプリ版:「スタンプのみでお礼する」機能のリリースについて

Javascriptの正規表現です。Javascriptに限らなくてもヒントになれば言語は問いません。

括弧内にある複数カンマを置き換えたい。

aaaa(1,2),bbbbbb(1,2,3,4),ccccc(1),dddd(1,2,3)

なんていう文字列にあるカッコ内のカンマを

aaaa(1@2),bbbbbb(1@2@3@4),ccccc(1),dddd(1@2@3)

@に置き換えることは、正規表現で可能でしょうか?

/\((.+\,.+)\)/g
/\((.+(,).+)\)/g
などと試しましたがダメでしたわ…
わかる方いらっしゃいましたらお知らせください。

※要は、括弧外のカンマでsplitしたいんですが、カッコ内にもあるのでうまくいかず、、、1文字ずつ検査していくしかないのかな、と思ったり。他の方法がありましたらそれも教えてもらえると助かります。

A 回答 (4件)

どのような文字列でも処理できる様にするため、


括弧の範囲内を一時的に退避させて、
余分なカンマを無くしてはいかがでしょうか。

var s = "a,bb(1),ccc(2,3),d(e(4,5),6)";

var w = []; // 退避先
var r = v => { w.push(v); return "@" + (w.length-1) };
var p = /\([^\(\)]*\)/g;
while (p.test(s)) s = s.replace(p, r); // 退避する

// w == [ "(1)", "(2,3)", "(4,5)", "(e@2,6)" ] ← 括弧が退避済み
// s == "a,bb@0,ccc@1,d@3" ← 余計なカンマがない

var q = /@(\d+)/g;
while (q.test(s)) s = s.replace(q, (v,i)=>w[i]); // 元に戻す
    • good
    • 1
この回答へのお礼

ありがとうございます。
おお、これはすごい。ネストしている括弧も対応してますね。完璧です。
正規表現の部分は私の理解を超えているのでじっくり研究してみたいと思います。

wの配列の中がアクロバットしていて、こんなこともできるのかと感嘆しました。

お礼日時:2021/04/15 21:42

既に回答にあるものについて補足です。


split()は正規表現で実行できるので、下記でいけます。

var str = "aaaa(1,2),bbbbbb(1,2,3,4),ccccc(1),dddd(1,2,3)";
var result = str.split(/(?<=\)),/g);
    • good
    • 0
この回答へのお礼

ありがとうございます!
締め切らなくてよかった!!
こんな方法があるんですね。知りませんでした。

実際は括弧がない例外もあるので括弧があるかどうか検知してから条件分岐してからいただいたsplitの正規表現を実行させるのがよさそうだと辿り着きました。
助かります!!

※splitでもgの修飾子は必要なんですね。躓きそうなところだ。。。

お礼日時:2021/04/15 14:10

逆に考えると区切り文字を置換すれば良いのでは?


経験皆無の者ですが考え方からググって検証したら、

var st = "aaaa(1,2),bbbbbb(1,2,3,4),ccccc(1),dddd(1,2,3)";
var str = st.replace(/(?<=\)),/g,'_');

console.log(str);
console.log(str.split('_'));

結果:
aaaa(1,2)_bbbbbb(1,2,3,4)_ccccc(1)_dddd(1,2,3)
[ 'aaaa(1,2)', 'bbbbbb(1,2,3,4)', 'ccccc(1)', 'dddd(1,2,3)' ]

となりましたが、これは不適合ですか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
確かにいただいた考え方で出来そうです!

括弧がない例外もあるようなので出来る限り括弧内の変更が取れればいいと思っていたのですが、例外は例外で検知させて処理するのがよさそうです。

助かりました!!

お礼日時:2021/04/15 10:53

括弧がネストしないことを前提にするなら前者は後読みでできそうな気がする. 言語によっていろんな制限があったりするので面倒くさいんだけど, 「括弧の中にあるカンマ 1個」なら


/(?<= \([^\)]*),/
でマッチする, かもしれない.

同じように考えれば「括弧の中にないカンマ」にマッチする正規表現も書けるような気がする.

いずれにしてもこの方針でいくなら後読みを使うことになるはず.
    • good
    • 0
この回答へのお礼

ありがとうございます。
No.2の方と同じく「括弧の中にないカンマ」のマッチがよさそうです。
助かりました!

お礼日時:2021/04/15 10:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!