C# - 文字列配列のリストに指定された形式と文字列を破壊する

okwaves2024-01-25  8

形式 (データ型 - 文字列) は、{1}.{0}.{2}@xyz.com という形式です。また、[email protected] という同じ形式の文字列もあります。リスト、文字列配列、またはその他のデータ構造に指定された形式に文字列を分割するにはどうすればよいですか (形式で指定された数値は、対応する文字列が格納されるインデックスです)。区切り文字は、 、 、 /

などの任意の文字にすることができます。

例:-

1) Format - {0}.{1}@xyz.com  
   String - [email protected]  
   String array[]= { "name0", "name1"}
2) Format - {1}.{0}.{2}@xyz.com  
   String - [email protected]  
   String array[]= { "pos1", "pos0", "pos2"}
3) Format - {0}.{1}  
   String - name0.name1  
   String array[] = { "pos0", "pos1"}

何か試してみましたか?何かエラーに遭遇しましたか? .(ピリオド)が唯一の区切り文字として使用されているか、それが異なりますさまざまな入力について?

– プラサド・テルキカール

2020 年 9 月 3 日 16:36

何でも構いません

– アシシュ・アガルワル

2020 年 9 月 3 日 16:37

必要に応じて、{#} を (.*?) に置き換え、他の文字をエスケープすることで、形式を正規表現に変換できる場合があります。ただし、「{0}.{1}」の形式が正しくないという問題があります。何かに一致するでしょう「1.2.3」のようなNG 2 つの異なる方法で。

– ジュハール

2020 年 9 月 3 日 16:38

余談ですが、私は通常、このようなコードを見つけたときに、文字列補間を使用するように変換します。 $"{foo} バー {baz}"。

– エリック J.

2020 年 9 月 3 日 16:48



------------------------

using System;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConAppCore
{
    class Program
    {
        static void Main(string[] args)
        {
            Test("{0}.{1}@xyz.com", "[email protected]");
            Test("{1}.{0}.{2}@xyz.com", "[email protected]");
            Test("{0}.{1}", "name0.name1");
        }
        static void Test(string format, string input)
        {
            string pattern = CreatePattern(format);
            var match = Regex.Match(input, pattern);

            var array = match.Groups
                .OfType<Group>()
                .Skip(1)
                .OrderBy(g => g.Name, StringComparer.Ordinal)
                .Select(g => g.Value)
                .ToArray();

            Console.WriteLine(string.Join(", ", array));
        }
        static string CreatePattern(string format)
        {
            var sb = new StringBuilder();
            var match = Regex.Match(format, @"(.*?)\{(\d+)\}");
            int index;
            int length;

            do
            {
                sb.Append(Regex.Escape(match.Groups[1].Value));
                sb.Append("(?'group").Append(match.Groups[2].Value).Append(@"'\w+)");

                index = match.Index;
                length = match.Length;

                match = match.NextMatch();

            } while (match.Success);

            sb.Append(Regex.Escape(format.Substring(index + length)));

            return sb.ToString();
        }
    }
}



------------------------

次のことを試してください:

           string[] inputs = { "[email protected]", "[email protected]", "name0.name1" };
            string pattern = "(?'path'.*)@(?'site'.*)";

            foreach(string input in inputs)
            {
                Match match = Regex.Match(input,pattern);
                string[] paths = match.Groups["path"].Value.Split(new char[] {'.'}).ToArray();
                string site = match.Groups["site"].Value;
                Console.WriteLine("Path : '{0}', Site : '{1}'", string.Join("-", paths), site);
            }
            Console.ReadLine();

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。