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

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

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

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

3回答

1309閲覧

ruby でgsubを使い漢数字を英数字に変換したい

ma_k

総合スコア33

Ruby

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/01/05 07:47

rubyを使って漢数字を英数字に変換したいのですが困っています

「漢数字+号」以外の漢数字を英数字にしたいです
〇一二三四五六七八九をそれぞれ
〇を0に
一を1にしていきたいです。

下記のコードだと、
表示が[0-9]になってしまい困っています

ruby

1buffer = f.read() 2p buffer 3 4buffer.gsub!(/[〇一二三四五六七八九](?!号)/, '[0-9]');

参考にしたサイトはrubyで漢数字を数字に変換する方法 多分これが一番簡単だと思います()
です。
文章内の漢数字を残したい箇所と変換したい箇所とが混ざっているため
なかなかうまくできず困っています。

初歩的な質問だとは十分承知ですが
どなたかご教授いただけたらありがたいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

buffer.gsub!(/([〇一二三四五六七八九])(?!号)/){$1.tr("〇一二三四五六七八九", '0-9')}
でどうでしょうか。

投稿2021/01/05 09:40

tatsu99

総合スコア5493

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

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

winterboum

2021/01/05 10:06

先を越された ^^) あ、 でもこれだと 七月三日 が 73になりません?
winterboum

2021/01/05 10:08

だいじょうぶだった
ma_k

2021/01/05 14:21

ありがとうございます!
guest

0

対応表を作って変換をかけていくのが応用も効いて楽かなと思います。

rb

1correspondence_table = %w[ 〇 一 二 三 四 五 六 七 八 九 ].zip([*'0'..'9']).to_h 2 3'一二三号'.gsub(/[〇一二三四五六七八九](?!号)/) { |s| correspondence_table[s] } 4#=> "12三号"

正規表現が正しいかどうかはわかりませんが、とりあえず漢数字で直後に「号」がつくもの以外は変換できます。

投稿2021/01/05 10:01

編集2021/01/05 10:03
Mugheart

総合スコア2349

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

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

0

十とか拾とかを考えなくて良いなら、trのが楽
"〇一二三四五六七八九".tr("〇一二三四五六七八九", '0-9') => "0123456789"
追記
号の前が二桁以上になる場合は
buffer.split(/([〇一二三四五六七八九十百千]+号)/).map{|str| str =~ /号/ ? str : str.tr("〇一二三四五六七八九","0-9")}.join
以外も二桁以上になる場合は tr でなく、参照サイトのmethodを。

号なら万はいかないよね

投稿2021/01/05 08:00

編集2021/01/06 05:52
winterboum

総合スコア23567

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

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

ma_k

2021/01/05 08:18

回答ありがとうございます。 この場合、号が漢数字の後につくとき以外という設定はどこに書けばいいのでしょうか、 (?!号)の部分です。 理解不足ですみません。
winterboum

2021/01/05 09:50

ああ、、、それは考慮していなかった。 考えます
winterboum

2021/01/05 10:05

buffer.gsub(/([〇一二三四五六七八九]+)([^号])/){$1.tr("〇一二三四五六七八九", '0-9')+$2}
winterboum

2021/01/05 22:44

解決したあとで気がついたのですが、3人の解みな 十九号まではよいのですが二十号から先おかしくなります。2十号, 3十一号 のように。 19号以上にはならない?
ma_k

2021/01/06 04:22

コメントありがとうございます。そうなんです、桁が多いとき2十一号になってしまい、今解決策考えているところです、、、
winterboum

2021/01/06 05:24

逆に、数字から漢数字に直すのって見つけてます? それがあればまず全部数字にして、それから\d+号を変換する方法が取れます
ma_k

2021/01/09 04:04

返答遅くなりすみません。 逆パターンを考えていなくて見つけてなかったので このサイトhttps://www.rubydoc.info/gems/ya_kansuji/0.2.0 を探しました。 これで号がある数字の変換を考えてみます。
winterboum

2021/01/09 08:55

追記の方法見ていただけました?
ma_k

2021/01/09 12:51

すみません。追記見落としてました。試してみます!
ma_k

2021/01/14 04:42

追記してくださったコード、試してみたら、うまく変換されず、、、なので、もう少し、追求してみます。
winterboum

2021/01/14 08:22

どうなりました?
ma_k

2021/01/14 15:04

何も変換されずでした。 f=File.open("/Users/***/Desktop/a.txt","r") buffer = f.read() p buffer buffer.split(/([〇一二三四五六七八九十百千]+号)/).map{|str| str =~ /号/ ? str : str.tr("〇一二三四五六七八九","0-9")}.join p buffer f=File.open("/Users/***i/Desktop/a.txt","w") f.write(buffer) f.close() で試しています。。。
winterboum

2021/01/14 22:41

ああ、buffer自体は変更していません。 変更後 = buffer.split(/([〇一 ..... として 変更後 を使ってください。
ma_k

2021/01/17 12:20

コメントありがとうございます。 変更後?よくわからなく、 下記のようにしたのですが、うまく行きません。、、 f=File.open("/Users/***/Desktop/a.txt","r") buffer = f.read() p buffer 変更後 = buffer.split(/([〇一二三四五六七八九十百千]+号)/).map{|str| str =~ /号/ ? str : str.tr("〇一二三四五六七八九","0-9")}.join p buffer f=File.open("/Users/***/Desktop/a.txt","w") f.write(buffer) f.close() ぽんこつですみません。
winterboum

2021/01/17 13:27

buffer = buffer.split(/([〇一二三四五六七八九十百千]+号)/).map{|str| str =~ /号/ ? str : str.tr("〇一二三四五六七八九","0-9")}.join で試してください
ma_k

2021/01/19 02:34

試してみました!!!ありがとうございます!!!! 無事変換される箇所もあるのですが、第十2条になってしまったり、漢字のままの箇所もあり、 ちょっと探ってみて、なかなかなので、他のパターンも試してみます!
winterboum

2021/01/19 03:14

そのもと文字列いただけますか
ma_k

2021/01/19 07:53

色々とすみません。 一部分なのですが、 このようなテキストの 漢数字+号 以外を英数字にしたいです。 第一項(ただし書を除く。)、前項、第七項、第十二項及び第十四項、第五十七条の二第三項第二号、第五十七条の三第二項、第五十九条第一項及び第三項、第五十九条の二第一項、第六十条第一項、第六十条の二第一項及び第四項、第六十八条の三第一項、第六十八条の四、第六十八条の五(第二号イを除く。第六項において同じ。)、第六十八条の五の二(第二号イを除く。第六項において同じ。)、第六十八条の五の三第一項(第一号ロを除く。第六項において同じ。)、第六十八条の五の四(ただし書及び第一号ロを除く。)、第六十八条の五の五第一項第一号ロ、第六十八条の八、第六十八条の九第一項、第八十六条第三項及び第四項、第八十六条の二第二項及び第三項、第八十六条の五第三項並びに第八十六条の六第一項に規定する建築物の容積率(第五十九条第一項、第六十条の二第一項及び第六十八条の九第一項に規定するものについては、建築物の容積率の最高限度に係る場合に限る。第六項において同じ。)の算定の基礎となる延べ面積には、建築物の地階でその天井が地盤面からの高さ一メートル以下にあるものの住宅又は老人ホーム、福祉ホームその他これらに類するもの(以下この項及び第六項において「老人ホーム等」という。)の用途に供する部分(第六項の政令で定める昇降機の昇降路の部分又は共同住宅若しくは老人ホーム等の共用の廊下若しくは階段の用に供する部分を除く。以下この項において同じ。)の床面積(当該床面積が当該建築物の住宅及び老人ホーム等の用途に供する部分の床面積の合計の三分の一を超える場合においては、当該建築物の住宅及び老人ホーム等の用途に供する部分の床面積の合計の三分の一)は、算入しないものとする。 を試すと 第1項(ただし書を除く。)、前項、第7項、第十2項及び第十4項、第5十7条の2第3項第二号、第5十7条の3第2項、第5十9条第1項及び第3項、第5十9条の2第1項、第6十条第1項、第6十条の2第1項及び第4項、第6十8条の3第1項、第6十8条の4、第6十8条の5(第二号イを除く。第6項において同じ。)、第6十8条の5の2(第二号イを除く。第6項において同じ。)、第6十8条の5の3第1項(第一号ロを除く。第6項において同じ。)、第6十8条の5の4(ただし書及び第一号ロを除く。)、第6十8条の5の5第1項第一号ロ、第6十8条の8、第6十8条の9第1項、第8十6条第3項及び第4項、第8十6条の2第2項及び第3項、第8十6条の5第3項並びに第8十6条の6第1項に規定する建築物の容積率(第5十9条第1項、第6十条の2第1項及び第6十8条の9第1項に規定するものについては、建築物の容積率の最高限度に係る場合に限る。第6項において同じ。)の算定の基礎となる延べ面積には、建築物の地階でその天井が地盤面からの高さ1メートル以下にあるものの住宅又は老人ホーム、福祉ホームその他これらに類するもの(以下この項及び第6項において「老人ホーム等」という。)の用途に供する部分(第6項の政令で定める昇降機の昇降路の部分又は共同住宅若しくは老人ホーム等の共用の廊下若しくは階段の用に供する部分を除く。以下この項において同じ。)の床面積(当該床面積が当該建築物の住宅及び老人ホーム等の用途に供する部分の床面積の合計の3分の1を超える場合においては、当該建築物の住宅及び老人ホーム等の用途に供する部分の床面積の合計の3分の1)は、算入しないものとする。 になり、テキスト他の箇所で、一・五倍以下、十分の五、十分の八、などがそのままでした。 やりたいことが、号のついた数字は漢数字、それ以外を英数字(数値、分数、日付も含む)なので、 逆のパターンの英数字から号のある数字を漢数字にする方法の方が早いのかなとふと思い少し考えています。 調べていると、YaKansuji という ruby 用の日本語の漢数字ライブラリがありました。が、まだ考え中です。 お手間取らしてしまい申し訳ありません。
winterboum

2021/01/19 08:10

直すところにふた桁以上の数字があるのね。 そういう条件をきちんと示さないとだめですよ。もともとの質問が「〇一二三四五六七八九」しか示していないから十とかが落ちてしまいます。 str.tr("〇一二三四五六七八九","0-9")} を 「参照サイトのmethod」で置き換えてください。 YaKansuji でうまく行けばよいですが。
ma_k

2021/01/20 13:02

すみません。言葉足らずで申し訳ありません。 条件整理してからでないとだめですね。 置換えて試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問