0

source という文字列があるとします。「ニューヨーク市 - 12A - 1234B」が含まれています

ルールは次のとおりです。

を。文字列の先頭に最も近い 2 つの数値を、次の文字と共に保持し、results と呼ばれる別の文字列に配置する必要があることはわかっています。

b. この次の文字が数字になるか文字になるかは定かではありません

c. 文字列自体のフォーマットはさまざまです。「NY 12A 1234B」のようになります。

d. 他のことはあまり気にしません!

今、私は無限の叡智でこの怪物を作り上げました。それは機能しますが、これを行うためのより良い方法、またはせいぜいクリーンでパフォーマンスを意識した方法があることを教えてください。

class Program
    {
        public static int i = 0;
        public static int q = 0;
        public static int x = 0;
        public static string source = "New York City - 12A - 1234B";
        public static string results = "";
        public static char[] from_source_char;
        public static List<string> from_source_list = new List<string>();

        static void Main(string[] args)
        {
            from_source_char = source.ToCharArray();
            foreach (char unit in from_source_char)
            {
                from_source_list.Add(unit.ToString());
            }


            Console.WriteLine("Doing while " + i.ToString() + " < " + (from_source_list.Count() - 1).ToString());
            while (i < from_source_list.Count() - 1)
            {
                Console.WriteLine("i is at " + i.ToString());
                Console.WriteLine("Examining " + from_source_list[i].ToString());

                try
                {
                    q = Convert.ToInt32(from_source_list[i]);
                    results += from_source_list[i].ToString();
                    Console.WriteLine("Found part 1!");
                    x++;
                }
                catch
                {
                    Console.WriteLine("Disregarding " + from_source_list[i].ToString());
                    // do nothing
                }

                if (x == 2)
                {
                    Console.WriteLine("Found final part! " + from_source_char[i+1].ToString());
                    results += from_source_char[i+1].ToString();
                    break;
                }

                i++;

            }

            Console.WriteLine("Result is " + results.ToString());
            Thread.Sleep(999999);
        }
    }
4

2 に答える 2

3

Regexこのパターンでa を使用できます: @"^.*?(?<numbers>\d{2}\w).*$".

例:

var f = @"^.*?(?<numbers>\d{2}\w).*$";
var match = Regex.Match("NY 12A 1234B", f);
var result = match.Groups["numbers"].Value;
于 2012-12-19T19:16:37.920 に答える
1

正規表現のない別のバージョン:

char a = source.First(pos => char.IsDigit(pos));
int b = source.IndexOf(a);
string result = source.Substring(b, 3);
Console.WriteLine(result);
于 2012-12-19T19:32:52.187 に答える