VB.netで右からの文字列を取得する方法

みなさんこんにちは!

ひろぽんです!

そういえばVB.NETで右から何文字って感じで文字を取得するのってどうするんだっけ??って思っていろいろ調べたので記事にしようと思います!

目次

VB.netで右からの文字列を取得するには、Strings.Rightを使う

💡 VB.net の文字列関数を C# に書き直したい場合は VB.net で Right / Mid / Left を C# に翻訳する完全早見表 でまとめてます。VB6 移行案件で必須の対応表です。

これ。私いろいろ勘違いしていました。

下記のようなコード(変数に値を入れてるだけ)があった場合、name.Rightで右からの文字を取得できると思ったんです。

    Sub Main()
        Dim name = "東京太郎"
    End Sub

でもname.Rightというのはありません。

よくよく調べてみるとVB.netの場合、Stringsというモジュールが用意されており、これを使うことで、右から何文字って感じで文字を取得することができるみたいですね!

    Sub Main()
        Dim name = "東京太郎"
        Dim getName = Strings.Right(name, 2)
        Console.WriteLine(getName)
        Console.ReadLine()
    End Sub

Stringsモジュールには何がある?

ではVB.netにだけ用意されているStringsモジュールですが、他にどんな便利なメソッドがあるのか調べてみました!

独断と偏見で便利だなーと思ったメソッドを羅列していきます!

String.splitで文字を分ける

    Sub Main()

        Dim place = "東京,大阪,名古屋"
        Dim places = Strings.Split(place, ",")
        Console.WriteLine(places(0) & places(1) & places(2))
        Console.Read()

    End Sub

第1引数に分けたい文字列、第2引数に分ける文字を。これで戻り値がstringsの配列で分けて戻ってきます。

Strings.Joinで文字配列を1つの文字列にする

    Sub Main()

        Dim places As String() = {"東京", "大阪", "名古屋"}
        Dim combineStr = Strings.Join(places)
        Console.WriteLine(combineStr)
        Console.Read()

    End Sub

これを実行すると

Strings.InStrで文字列のどの部分に含まれているかを返す

    Sub Main()

        Dim name = "東京太郎"
        Dim resultNum = Strings.InStr(name, "東京")
        Console.WriteLine(resultNum)
        Console.Read()

    End Sub

これを実行すると

もし指定した文字列が存在しなかった場合、下記のようになります。

    Sub Main()

        Dim name = "東京太郎"
        Dim resultNum = Strings.InStr(name, "大阪")
        Console.WriteLine(resultNum)
        Console.Read()

    End Sub

なのでこれを応用すると下記のようなことができますね!

    Sub Main()

        Dim weather = "東京は今日はいい天気です"

        Dim notContain = 0
        If Strings.InStr(weather, "大阪").Equals(notContain) Then
            Console.WriteLine("文字列に大阪は含まれていません")
        Else
            Console.WriteLine("文字列に大阪は含まれています。")
        End If


        Console.Read()

    End Sub

文字列の存在チェックですが、書いていて思った。

これcontainsで出来ますね。

下記で代用できますね。

    Sub Main()

        Dim weather = "東京は今日はいい天気です"

        If weather.Contains("大阪") Then
            Console.WriteLine("文字列に大阪は含まれています。")
        Else
            Console.WriteLine("文字列に大阪は含まれていません")
        End If
        Console.Read()

    End Sub

以上!

Vb.netだけに存在するStringsモジュールの話でした!

C#の場合同じ.netでもモジュールって考え方が無いので、別の方法で取得しなければいけません!

💡 補足: 業務系の現場でよくハマるパターン

VB.net の文字列処理、特に C# に移植するときの罠が3つほど。VB6 から VB.net、そして C# へ移行する案件で何度も踏みました。

① C# の Substring と引数順序が逆で混乱する

VB.net の Strings.Right(text, 3) は「右から3文字」ですが、C# に直訳しようとして text.Substring(3) と書くと「先頭3文字を捨てる」になり、結果が逆になります。C# 相当は text.Substring(text.Length - 3)。地味だけど移植時の頻出バグです。 VB.net Right/Mid/Left を C# に翻訳する完全早見表 に対応表を出してます。

② Null 文字列で NullReferenceException

VB.net の Strings.Right(Nothing, 3) は空文字を返してくれますが、C# の str.Substring(str.Length - 3) は str が null だと NullReferenceException で落ちます。VB6 → C# 移植時は null チェックを必ず噛ませるか、 str?.Substring(...) ?? "" の書き方にしておく。

③ 全角文字での「3文字」が想定と違う

VB.net の Strings.Right("あいうえお", 3) は「うえお」が返りますが、絵文字やサロゲートペアが入ると別の挙動になることがあります。.NET の文字列は基本 UTF-16 ですが、 StringInfo でグラフィム単位に分解しないと「絵文字を半分にぶった切る」事故が起きます。業務系では絵文字はまず無いですが、社員名にユニコード結合文字が入っていた事案は実際あります。

❓ よくある質問

Q1. VB.net の Mid 関数の C# 相当は?

A. Strings.Mid(text, 開始位置, 文字数) は C# の text.Substring(開始位置 - 1, 文字数) です。VB は 1 始まりなので -1 が必要。詳細は VB.net Right/Mid/Left を C# に翻訳する完全早見表 で対応表にしてます。

Q2. VB.net の Len 関数と String.Length の違いは?

A. ほぼ同じですが、 Len(Nothing) は 0 を返すのに対し、 (null as string).Length は NullReferenceException で落ちます。VB6 移行時に Len → Length に機械置換すると null 渡しで爆発します。

Q3. VB.net の InStr と C# の IndexOf の違いは?

A. Strings.InStr は 1 始まり・見つからないと 0 を返します。C# の IndexOf は 0 始まり・見つからないと -1 を返します。判定値が違うので変換時に if 文の条件を見直す必要あり。

Q4. VB.net の文字列結合パフォーマンス、C# でも同じ?

A. VB.net も C# も内部は同じ .NET ランタイムなので、大量結合では StringBuilder が定石。 C# 文字列結合のパフォーマンス完全比較 でベンチマーク付きで書いてます。

Q5. VB.net から C# に移植するときの定番のハマりポイントは?

A. 大きく3つ。(1)配列のインデックス基底(VB は 0/1 選択可、C# は 0 固定)、(2)文字列関数の引数順序(Right/Left/Mid)、(3)null vs Nothing の挙動差。これらは Form 間の値受け渡しで FormとFormの間で値の共有・受け渡し 系の設計時にもよく出てきます。

📚 関連記事

この記事が気に入ったら
いいねしてね!

どんどんシェア待ってるぜ!!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次