KojiDoiさんのアドバイス通りのやり方でやってみました。
これで一応期待通りに動きました!
TypeScript
1function splitByBadge(subject: string): string[] {
2 return subject.replace(/(\[.\])/g, '\\$1') // 区切りの前に印(\)を付ける
3 .replace(/\(.*\\.*\)/g, match => match.replace(/\\/g, '')) // カッコ内にある\は消去して置換
4 .replace(/\]\\\[/g, '][') // 連続している場合はまとめる
5 .split('\\') // \で分割
6 .splice(1); // 先頭の余分な分割を消す
7}
もっと洗練されたやり方や、まずい点があったら教えてください...!!
追記:
誤りがありました。
.replace(/(.\.)/g, match => match.replace(/\/g, ''))
が、"[a] aiueo(aiueo) [b] xxxxx(ddd)"という場合に、[b]の分割を抹消してしまってた.
訂正後:
TypeScript
1function splitByBadge(subject: string): string[] {
2 return subject.replace(/(\[.\])/g, '\\$1') // 区切りの前に印(\)を付ける
3 .replace(/\([^)]*\\[^)]*\)/g, match => match.replace(/\\/g, '')) // カッコ内にある\は消去して置換
4 // ↑変更
5 .replace(/\]\\\[/g, '][') // 連続している場合はまとめる
6 .split('\\') // \で分割
7 .splice(1); // 先頭の余分な分割を消す
8}
もっと洗練されたやり方や、まずい点があったら教えてください...!!
追記:
誤りがありました。
.replace(/([^)]\[^)])/g, match => match.replace(/\/g, ''))
が、"[a] aiueo(aaa(aaa) [b] xyz)"という場合に、[b]を分割してしまう。。。
正規表現苦手だ。。。。
追記:
()の入れ子には対応できませんでしたが、今回は問題なさそうなので、これで行きます。
ありがとうございました。
TypeScript
1function splitByBadge(subject: string): string[] {
2 return subject.replace(/(\[.\])/g, '\\$1')
3 .replace(/\([^)]*\\[^(]*\)/g, match => match.replace(/\\/g, ''))
4 .replace(/\]\\\[/g, '][')
5 .split('\\')
6 .splice(1)
7 .map(s => s.trim());
8}