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

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

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

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

Q&A

解決済

6回答

649閲覧

ruby 正規表現 末尾の変換

Awtanabe

総合スコア25

Ruby

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

1グッド

1クリップ

投稿2019/12/30 04:24

編集2019/12/30 04:25

やりたい事

rubyの正規表現で、文字列を下記の条件で文字を変換したいのですが、
うまくいかず質問させてください。

- 条件 - 末尾の文字がyの場合、iesに変換する。 - ※ただし、yの前の文字が母音(a,i,u,e,o)のものは除く
例) study → studies play → plays

やって見た事

まずマッチさせることを先に確認しているのですが、うまくいかず

末尾がy$でその前が否定(?!母音)でやって見たのですが

str = "study" # 母音に該当しない && 末尾y に該当するをしたつもりがうまくいかず puts str.match(/(?!a)|(?!i)|(?!u)|(?!e)|(?!o)y$/) # &&の表現がうまくできていないのかなと思い下記も試しましたがだめ。 puts str.match(/(?=.*(?!a)|(?!i)|(?!u)|(?!e)|(?!o))(?=.*y$)/)

どなたかご教示いただけないでしょうか。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答6

0

"study".sub(/([^aiueo])y$/,"\1ie")+"s"
"play".sub(/([^aiueo])y$/,"\1ie")+"s"

最後の +"s" が不満ですが、私の正規表現力で直ぐ出てくるのがこの程度

追記
"book".sub(/([^aiueo])y$/,"\1ie")+"s"
もうまく行くじゃん!!

投稿2019/12/30 04:46

編集2019/12/30 04:49
winterboum

総合スコア23347

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

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

0

「否定後読み」を使えばいいのではないでしょうか。

irb(main):026:0> a => "try" irb(main):027:0> b => "trey" irb(main):028:0> a.sub(/(?<![aiueo])y/, "ies") => "tries" irb(main):029:0> b.sub(/(?<![aiueo])y/, "ies")

投稿2019/12/30 06:27

KojiDoi

総合スコア13671

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

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

0

参考情報

  • dry-inflector の実装コードの一部 ¥

https://github.com/dry-rb/dry-inflector/blob/master/lib/dry/inflector/inflections/defaults.rb#L40

... inflect.plural(/([^aeiouy]|qu)y\z/i, '\1ies') ...

投稿2019/12/30 06:23

katoy

総合スコア22324

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

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

0

末尾がyのケースだけ複数化できればいいということもないと思うので、
いろいろなパターンをcase~whenでパターンごとに分岐することになるかと思います。
esを付けるケースなど。

そうであれば、+ysのケースと+iesのケースを別々に扱えば正規表現も簡単で分かりやすくなります。

投稿2019/12/30 05:52

otn

総合スコア84555

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

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

0

ベストアンサー

こんにちは

他にもよりよいやり方があるかもしれませんが、一例として、こんなのはどうでしょう?

ruby

1%w{study play key joy guy}.each do |s| 2 p = s.sub(/([aiueo]?)y$/) { $1.empty? ? "ies" : "#{$1}ys" } 3 printf("%s => %s\n", s, p) 4end

study => studies

play => plays
key => keys
joy => joys
guy => guys

参考になれば幸いです。

補足

ご質問の本文に

- 条件 - 末尾の文字がyの場合、iesに変換する。 - ※ただし、yの前の文字が母音(a,i,u,e,o)のものは除く

とあったので、末尾が y 以外の文字で終わる場合は変換しないことも要件に含まれているという認識で、上記の回答コードを提示しております。

投稿2019/12/30 05:21

編集2019/12/30 05:52
jun68ykt

総合スコア9058

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

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

Awtanabe

2019/12/30 12:12

とても勉強になりました。ありがとうございます。
jun68ykt

2019/12/30 14:20

どういたしまして。 > とても勉強になりました。 とのことでよかったです????
guest

0

単数形を複数形にしたいのであれば,正規表現を使わない方法があります.
インストールする必要がありますが...

Ruby - Ruby に Railsの pluralize 関数はあるのか?|teratail https://teratail.com/questions/6916?link=qa_related_pc "gem でActiveSupportをインストールする必要がありますが、 sudo gem install activesupport require 'active_support/inflector' "dog".pluralize # dogs"

Ruby_pluralize

投稿2019/12/30 04:52

DrqYuto

総合スコア432

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問