選択肢が複数箇所にあっても OK なコードをば。
rb
1def bracket_expansion(text)
2 sequence = []
3 text.scan(/\{(.*?)\}|./m) do
4 sequence << ($1 ? $1.split(",") : [$&])
5 end
6 if sequence.size == 1
7 sequence.first
8 else
9 sequence.shift.product(*sequence).map(&:join)
10 end
11end
12
13puts bracket_expansion("用紙:{A4,B5} {縦,横}置き")
結果:
用紙:A4 縦置き
用紙:A4 横置き
用紙:B5 縦置き
用紙:B5 横置き
正規表現で〈\{(.*?)\}
もしくは任意の 1 文字〉をスキャンしているのがポイントです。
〈もしくは任意の 1 文字〉が入っているので,文字の拾い漏れはありません。
ただ,選択肢でない部分は 1 文字ずつ拾っているので,対象テキストが長い場合は効率が良くありません。
ここではコードの分かりやすさを優先しましたが,長いテキストに使うなら,もう少しややこしいコードになります。
で,
rb
1[["用"], ["紙"], [":"], ["A4", "B5"], [" "], ["縦", "横"], ["置"], ["き"]]
みたいな配列を作ります。
これの,いわば直積を作って,得られた各配列を join
でつなぐ,と。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。