質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

615閲覧

Rubyで改行を含む文字列をまとめて扱いたい

civillaw

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/06/05 07:18

前提・実現したいこと

Rubyの文字列マッチを使って文章の並び替えをしようと思っています。
具体的には以下のような文章を(カッコは全角カッコで空白は全角スペースです)

(未成年者の法律行為)
第五条 未成年者が法律行為をするには、その法定代理人の同意を得なければならない。ただし、単に権利を得、又は義務を免れる法律行為については、この限りでない。
2 前項の規定に反する法律行為は、取り消すことができる。
3 第一項の規定にかかわらず、法定代理人が目的を定めて処分を許した財産は、その目的の範囲内において、未成年者が自由に処分することができる。目的を定めないで処分を許した財産を処分するときも、同様とする。
(未成年者の営業の許可)
第六条 一種又は数種の営業を許された未成年者は、その営業に関しては、成年者と同一の行為能力を有する。
2 前項の場合において、未成年者がその営業に堪えることができない事由があるときは、その法定代理人は、第四編(親族)の規定に従い、その許可を取り消し、又はこれを制限することができる。

というものを
第五条 (未成年者の法律行為)
未成年者が法律行為をするには、その法定代理人の同意を得なければならない。ただし、単に権利を得、又は義務を免れる法律行為については、この限りでない。
2 前項の規定に反する法律行為は、取り消すことができる。
3 第一項の規定にかかわらず、法定代理人が目的を定めて処分を許した財産は、その目的の範囲内において、未成年者が自由に処分することができる。目的を定めないで処分を許した財産を処分するときも、同様とする。
第六条 (未成年者の営業の許可)
一種又は数種の営業を許された未成年者は、その営業に関しては、成年者と同一の行為能力を有する。
2 前項の場合において、未成年者がその営業に堪えることができない事由があるときは、その法定代理人は、第四編(親族)の規定に従い、その許可を取り消し、又はこれを制限することができる。

と並び替えしたいわけです。文章のまとまりを1)(趣旨) 2)第~条 3)条文の内容に分けて、それぞれ配列arr1,arr2,arr3に格納していけばできるのでは?と作っているところです。

発生している問題・エラーメッセージ

問題は、3)条文の内容を配列に入れると改行で区切られてしまうということです。

arr3[0]="未成年者が法律行為をするには、その法定代理人の同意を得なければならない。ただし、単に権利を得、又は義務を免れる法律行為については、この限りでない。\n
2 前項の規定に反する法律行為は、取り消すことができる。\n
3 第一項の規定にかかわらず、法定代理人が目的を定めて処分を許した財産は、その目的の範囲内において、未成年者が自由に処分することができる。目的を定めないで処分を許した財産を処分するときも、同様とする。\n"
arr3[1]="一種又は数種の営業を許された未成年者は、その営業に関しては、成年者と同一の行為能力を有する。\n
2 前項の場合において、未成年者がその営業に堪えることができない事由があるときは、その法定代理人は、第四編(親族)の規定に従い、その許可を取り消し、又はこれを制限することができる。\n"

としたいのに
arr3[0]="未成年者が法律行為をするには、その法定代理人の同意を得なければならない。ただし、単に権利を得、又は義務を免れる法律行為については、この限りでない。\n"
arr3[1]="2 前項の規定に反する法律行為は、取り消すことができる。\n"
arr3[2]="3 第一項の規定にかかわらず、法定代理人が目的を定めて処分を許した財産は、その目的の範囲内において、未成年者が自由に処分することができる。目的を定めないで処分を許した財産を処分するときも、同様とする。\n"
arr3[3]="一種又は数種の営業を許された未成年者は、その営業に関しては、成年者と同一の行為能力を有する。\n"
arr3[4]="2 前項の場合において、未成年者がその営業に堪えることができない事由があるときは、その法定代理人は、第四編(親族)の規定に従い、その許可を取り消し、又はこれを制限することができる。\n"

と、マッチングが改行で区切られてしまいます。

該当のソースコード

Ruby

1 i = 0 2 j = 0 3 k = 0 4 arr1 = [] #(未成年者の法律行為),(未成年者の営業の許可)を入れる 5 arr2 = [] #第五条,第六条を入れる 6 arr3 = [] #条文の内容を入れる 7 tmp = str.each_line do |line| #strは元の文章 8 if /.+)\n/ =~ line 9 arr1[i] = $& 10 i = i +1 11 end 12 13 if /.+条 / =~ line 14 arr2[j] = $& 15 j = j +1 16 end 17 18 if / .+\n/ =~ line 19 arr3[k] = $& 20 k = k +1 21 end 22 end

何かよい表現方法はないでしょうか? ご教授願います

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

each_lineですので改行毎に区切られているのは当然なので後でくっつけないといけません

ruby

1str = <<~JOUBUN 2 (未成年者の法律行為) 3 第五条 未成年者が法律行為をするには、その法定代理人の同意を得なければならない。ただし、単に権利を得、又は義務を免れる法律行為については、この限りでない。 4 2 前項の規定に反する法律行為は、取り消すことができる。 5 3 第一項の規定にかかわらず、法定代理人が目的を定めて処分を許した財産は、その目的の範囲内において、未成年者が自由に処分することができる。目的を定めないで処分を許した財産を処分するときも、同様とする。 6 (未成年者の営業の許可) 7 第六条 一種又は数種の営業を許された未成年者は、その営業に関しては、成年者と同一の行為能力を有する。 8 2 前項の場合において、未成年者がその営業に堪えることができない事由があるときは、その法定代理人は、第四編(親族)の規定に従い、その許可を取り消し、又はこれを制限することができる。 9JOUBUN 10 11arr1 = [] 12arr2 = [] 13arr3 = [] 14str.each_line.slice_before(/^(.*)$/).each do |midasi, *jb| 15 arr1 << midasi.chomp 16 arr2 << jb[0][/^./] 17 arr3 << jb.join.chomp 18end

投稿2021/06/05 08:47

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

civillaw

2021/06/06 05:33

回答ありがとうございます。理解が深まってきました。 度々の質問となり申し訳ないのですが、arr3の配列が ["第五条 未成年者が法律行為をするには、その法定代理人の同意を得なければならない。ただし、単に権利を得、又は義務を免れる法律行為については、この限りでない。\n2 前項の規定に反する法律行為は、取り消すことができる。\n3 第一項の規定にかかわらず、法定代理人が目的を定めて処分を許した財産は、その目的の範囲内において、未成年者が自由に処分することができる。目的を定めないで処分を許した財産を処分するときも、同様とする。", "第六条 一種又は数種の営業を許された未成年者は、その営業に関しては、成年者と同一の行為能力を有する。\n2 前項の場合において、未成年者がその営業に堪えることができない事由があるときは、その法定代理人は、第四編(親族)の規定に従い、その許可を取り消し、又はこれを制限することができる。"] となります。この配列から「第~条 」という箇所を消したいわけです。 sub(/第.+条 /,'') を用いてみましたが、思ったようにはいきません。 何かよい方法はないでしょうか?
asm

2021/06/06 06:08

この場合はsub!を使ったほうがいいですね
civillaw

2021/06/07 13:00

問題の箇所にsub!(/第.+条 /,'') としたら上手くいきました。 each_lineやeachの挙動を一つ一つ調べてようやく「改行毎に区切られている」との指摘が理解できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問