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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

1814閲覧

C#のTrimEndメソッドの処理結果が意味不明になります

Jishuku

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2020/05/24 14:10

前提・実現したいこと

TrimEndメソッドを使って、
末尾が「-fe」の英単語を複数形「-ves」に変換するプログラムを作ったのですが、
「knife」は正しく「knives」に変換されたのですが、
「coffeeffefe」(実在しない単語ですが)と入力するとなぜか「coves」と変換されてしまいました。(coffeeffevesと変換されるようにしたかった。)

こうなった原因を教えていただきたいです。

該当のソースコード

C#

using System; class Sample { public static void Main() { string word1 = "knife".TrimEnd('f','e') + "ves"; string word2 = "coffeeffefe".TrimEnd('f','e') + "ves"; Console.WriteLine(word1); Console.WriteLine(word2); } }

試したこと

TrimEndメソッドについてネットで調べてみたところ、このページhttps://www.sejuku.net/blog/44406
によれば、TrimEnd(Char,Char)の形で書けば末尾2文字を削除できるというような事が書かれており、実際に「knife」は正しくできましたが、「coffeeffefe」は駄目でした。

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

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

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

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

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

guest

回答3

0

ベストアンサー

まず初めに、質問に書いてある侍エンジニア塾は間違った情報を平気で垂れ流すサイトなので絶対に見ないようにしましょう。

String.TrimEnd メソッド

現在の文字列から、配列で指定された一連の文字が末尾に現れる箇所をすべて削除します。

上記のようにMicrosoftの公式ドキュメントでは2文字を指定すれば2文字だけが削除されるといった意味を示す表記はありません。配列で指定した文字が末尾にある場合はすべて削除すると書いてあります。
その為、「coffeeffefe」に対してTrimEnd('f','e')というのは末尾にある「f」と「e」をすべて削除するということになります。
つまり、家庭としては以下のようになります。

1回目:coffeeffefe=>coffeeffef(末尾の「e」を削除)
2回目:coffeeffef=>coffeeffe(末尾の「f」を削除)
3回目:coffeeffe=>coffeeff(末尾の「e」を削除)
4回目:coffeeff=>coffeef(末尾の「f」を削除)
5回目:coffeef=>coffee(末尾の「f」を削除)
6回目:coffee=>coffe(末尾の「e」を削除)
7回目:coffe=>coff(末尾の「e」を削除)
8回目:coff=>cof(末尾の「f」を削除)
9回目:cof=>co(末尾の「f」を削除)
10回目:co=>co(末尾が引数で指定した「f」でも「e」でもないため、削除なしでメソッドは終了)
となり、TrimEnd('f','e')の結果として「co」を戻り値として処理が終了します。
そこから「ves」を追加していますので「coves」が最終結果となります。

つまり、TrimEnd('f','e')は末尾の「fe」を削除するという意味ではありません。

やりたいことが質問内容から推測すると、末尾が「fe」の場合に「fe」を削除するというのであるならば、EndWith("fe")で条件判断を行い、Trueの場合に対象となる文字列を全体の長さから"fe".Lengthの文字数を引いた長さの文字列を右から取得するというやり方になるでしょう。

正規表現でもできると思いますが、正直ややこしいため、まずは基本的なやり方を自力で思いつけるようになってからもっと複雑な条件を一気にやりたいとなったときに調べた方がいいかと思います。

投稿2020/05/24 14:42

len_souko

総合スコア1348

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

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

Jishuku

2020/05/25 02:20

ありがとうございます。 侍エンジニア塾は信頼できないという事 このメソッドの本当の仕様 代わりの正しいプログラムもこれをヒントに組むことができました。
guest

0

TrimEndは指定された一連の文字が末尾に現れる箇所をすべて削除するからです。
String.TrimEnd メソッド (System) | Microsoft Docs

"coffeeffefe".TrimEnd('f','e')の結果は、末尾の'f','e'が全て削除された"co"になります。

投稿2020/05/24 14:14

編集2020/05/24 14:16
ku__ra__ge

総合スコア4524

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

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

Jishuku

2020/05/25 02:15

ありがとうございます。 このメソッドの本当の仕様を知ることができました。
guest

0

うまく行かない理由は他の方が解説されているので、
参考までに正規表現による置換を使ったやり方など。

C#

1 string word1 = "knife"; 2 string word2 = "coffeeffefe"; 3 4 // System.Text.RegularExpressions をusingに追加してください 5 Console.WriteLine(Regex.Replace(word1, "fe$", "ves")); 6 Console.WriteLine(Regex.Replace(word2, "fe$", "ves"));

投稿2020/05/24 15:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Jishuku

2020/05/25 02:27

ありがとうございます。 正規表現は今後習得したいと考えているので、質問と直接違っていても回答頂てためになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問