LoginSignup
2
3

More than 5 years have passed since last update.

csharp > "Tag245":string から 245:intを取得する関数を実装 > Regexを使えばよりシンプルに > int.Parse(new Regex("[0-9]+").Match("Tag314").Value)

Last updated at Posted at 2015-09-05
動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5

UIコンポーネントなどにTagをつけて、そのタグのインデックスで異なる処理をしたいと思った。

それにはTagのstring文字列からインデックスを取得したい。

try1

LINQなど使ってできないか調べたが、Unityで動きそうなもので「これだ」というのを見つけられなかったので、以下の実装をした。

using System.Linq; // for .ToArray()
...
    int getIntFromAlphaNumericString(string src)
    {
        var query = src.ToArray ();
        int work = 0;
        bool found = false;

        for (int idx=0; idx < query.Length; idx++) {
            if (query[idx] >= '0' && query[idx] <= '9') {
                work = work * 10;
                work = work + query[idx] - '0';
                found = true;
            }
        }

        if (found) {
            return work;
        } else {
            return -1;
        }
    }

上記の関数の使用例

    public void ButtonClick() {
        string str;
        int val;

        // 1
        str = "Tag314";
        val = getIntFromAlphaNumericString (str);
        Debug.Log ("val = " + val.ToString () + " from " + str);

        // 2
        str = "Tag271um";
        val = getIntFromAlphaNumericString (str);
        Debug.Log ("val = " + val.ToString () + " from " + str);

        // 3
        str = "6022x1023";
        val = getIntFromAlphaNumericString (str);
        Debug.Log ("val = " + val.ToString () + " from " + str);

        // 4
        str = "404 not found";
        val = getIntFromAlphaNumericString (str);
        Debug.Log ("val = " + val.ToString () + " from " + str);

        // 4
        str = "Please contact to system administrator (:>)";
        val = getIntFromAlphaNumericString (str);
        Debug.Log ("val = " + val.ToString () + " from " + str);
    }

上記の実行例

Main_unity_-_150906-dynamicDisplayWithTag_-_PC__Mac___Linux_Standalone__Personal_.jpg

とりあえず取れた。

1つの問題として、6022x1023のように、2つの数値がある場合、60221023のようになってしまう。これはとりあえず自分が使う分にはこういう文字列を使わないということで回避する。

上記の実装はC#の機能でなくほとんどCで処理している。

Unityで動くC#にてもっと簡易な実装があれば知りたい。


improved

(追記 2015/09/09)
@laughter さんに教えていただいた方法。

using System;
using System.Text.RegularExpressions; // for Regex

public class Test
{
    public static void Main()
    {
        String msg = "Tag314";
        int val;

        msg = "Tag314";
        val = int.Parse(new Regex("[0-9]+").Match(msg).Value);
        Console.WriteLine(val.ToString());

        msg = "have271dogs";
        val = int.Parse(new Regex("[0-9]+").Match(msg).Value);
        Console.WriteLine(val.ToString());

        msg = "6022x1023";
        val = int.Parse(new Regex("[0-9]+").Match(msg).Value);
        Console.WriteLine(val.ToString());
    }
}

結果

314
271
6022

すごくシンプルになりました。どうもありがとうございます。

6022x1023については最初の数値だけ読み取ってくれるのもいいですね。

以下の環境でも動作確認しました。

動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
2
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3