Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反向格式化字符串并确定正确的结果_C#_Formatting_Reverse_Format String - Fatal编程技术网

C# 反向格式化字符串并确定正确的结果

C# 反向格式化字符串并确定正确的结果,c#,formatting,reverse,format-string,C#,Formatting,Reverse,Format String,我必须反转格式字符串以提取“电子邮件”,并确定正确的布尔结果 string input = "The Email field is required."; string required = "The {0} field is required."; string date = "The {0} field is not a valid date."; bool isRequired = false; bool isDate = false; string extractedField;

我必须反转格式字符串以提取“电子邮件”,并确定正确的布尔结果

string input = "The Email field is required.";

string required = "The {0} field is required.";
string date = "The {0} field is not a valid date.";

bool isRequired = false;
bool isDate = false;

string extractedField;
我的期望是将“Email”值设置为“extractedField”,将“isRequired”值设置为true

更新:
对不起,我解释得太笼统了。为了更好地阐明我的意图,我创建了一个fiddle

我相信我理解了您的查询。您希望检查当前消息与哪个“表达式”匹配,并根据它将相应的标志设置为true。还要检索有问题的“字段”

实现这一目标的一个方法是

更新

根据您的评论,已更新代码以支持多个字段

string input = "Age should be between 1 and 99.";
string required = "The {0} field is required.";
string date = "The {0} field is not a valid date.";
string range = "{0} should be between {1} and {2}.";

bool isRequired = false;
bool isDate = false;
bool isRange = false;
string extractedField;


var possibilities = new []
                    {
                        new KeyValuePair<string,Action>(ToRegex(required), ()=>((Action)(() => { isRequired = true;}))()),
                        new KeyValuePair<string,Action>(ToRegex(date), ()=>((Action)(() => { isDate = true;}))()),
                        new KeyValuePair<string,Action>(ToRegex(range), ()=>((Action)(() => { isRange = true;}))())
                    };
var result = possibilities
             .Where(x=>Regex.Match(input,x.Key).Success)
             .Select(x=> new KeyValuePair<IEnumerable<string>,Action>( 
                                            Regex.Match(input,x.Key).Groups.Cast<Group>().Where(c=>c.Name.StartsWith("Field")).Select(c=>c.Value),
                                            x.Value)).First();


var fields = result.Key;
result.Value();
Console.WriteLine($"{nameof(extractedField)}={string.Join(",",fields)},{Environment.NewLine}{nameof(isRequired)}={isRequired},{Environment.NewLine}{nameof(isDate)}={isDate}");
更新 根据您的评论,要支持多个单词,您可以使用以下内容

public string ToRegex(string value)
{
    var result = new List<string>();
    foreach(var item in value.Split(' '))
    {
        if(Regex.Match(item,@"{(?<Value>\d*)}").Success)
        {
            var match = Regex.Match(item,@"{(?<Value>\d*)}");

            result.Add(Regex.Replace(item,@"{(?<Value>\d*)}",$"(?<Field{match.Groups["Value"].Value}>[\\S ]*)"));
            continue;
        }
        result.Add(item);
    };
    return string.Join(" ",result);
}
公共字符串ToRegex(字符串值)
{
var result=新列表();
foreach(价值中的var项目分割(“”))
{
if(Regex.Match(项,@“{(?\d*)}”).Success)
{
var match=Regex.match(项,@“{(?\d*)}”);
结果.Add(Regex.Replace(item,@“{(?\d*)}”,$”(?[\\S]*)”);
继续;
}
结果.添加(项目);
};
返回字符串。Join(“,result);
}
尝试以下操作:

    class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = {
                                  "The Email field is required.",
                                  "The Username field is required.",
                                  "The InsertDate field is not a valid date.",
                                  "Age should be between 1 and 99."
                              };
            Type type;
            foreach (string input in inputs)
            {
                string word = ExtractFieldAndDeterminateType(input, out type);
                Console.WriteLine(word);
            }
            Console.ReadLine();
        }
        public static string ExtractFieldAndDeterminateType(string input, out Type type)
        {
            string[] words = input.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            int index = 0;
            if (words[0] == "The") index = 1;

            string word = words[index];

            switch (word)
            {
                case "Email" :
                    type = typeof(string);
                    break;

                case "Username":
                    type = typeof(string);
                    break;

                case "InsertDate":
                    type = typeof(DateTime);
                    break;

                case "Age":
                    type = typeof(int);
                    break;

                default:
                    type = (Type)Type.Missing;
                    break;
            }

            return word;
        }
    }

使用
Regex.Match
函数
extractField和determinateType
可以写成:

public static string ExtractFieldAndDeterminateType(string input, out Type type)
{
    var extractedField = "";
    string required = "The (.*) field is (.*).";
    //string date = "The (.*) field is not a (.*)."; => Not needed
    string range = "(.*)(?= should be between)";
    type = Type.Unknown;

    var match = Regex.Match(input, required);
    if (match.Success)
    {
        extractedField = match.Groups[1].Value;
        switch (match.Groups[2].Value)
        {
            case "required":
                type = Type.Error;
                break;
            case "not a valid date":
                type = Type.Date;
                break;
        }
    }
    else if ((match = Regex.Match(input, range)).Success)
    {
        extractedField = match.Groups[1].Value;
        type = Type.Range;
    }
    else
    {
        //Nothing 
    }
    return extractedField;
}
输出OP的测试数据:

Field is: Email and Type is: Error
Field is: Username and Type is: Error
Field is: InsertDate and Type is: Date
Field is: Age and Type is: Range

已编辑:添加了用于小提琴的示例代码

提供更好的输入字符串示例。你想得到字符串的第二个单词吗?在空格上使用字符串拆分并获取数组中的第二项。我用一个例子更新了帖子,以更好地解释我的意图。是的,这就是我要找的!非常感谢。您认为可以提取多个字段,比如这里的“范围”示例吗?我不想返回所有的结果(第一个就足够了),只想在extractedFields@Sauron请检查更新的代码。我还更新了代码以使用正则表达式而不是拆分字比较方法,并且它还支持多个字段。请检查点小提琴LIKI可以考虑这个答案是正确的,因为它是第一个有效的解决方案,描述得很好,适合于每一个使用。嗨,Anu Viswan,我注意到如果我用“新密码字段是必需的”来改变输入,它就不起作用了。看起来ToRegex方法只接受单个单词。非常感谢。@Sauron我已经更新了答案以支持该场景,请验证
public static string ExtractFieldAndDeterminateType(string input, out Type type)
{
    var extractedField = "";
    string required = "The (.*) field is (.*).";
    //string date = "The (.*) field is not a (.*)."; => Not needed
    string range = "(.*)(?= should be between)";
    type = Type.Unknown;

    var match = Regex.Match(input, required);
    if (match.Success)
    {
        extractedField = match.Groups[1].Value;
        switch (match.Groups[2].Value)
        {
            case "required":
                type = Type.Error;
                break;
            case "not a valid date":
                type = Type.Date;
                break;
        }
    }
    else if ((match = Regex.Match(input, range)).Success)
    {
        extractedField = match.Groups[1].Value;
        type = Type.Range;
    }
    else
    {
        //Nothing 
    }
    return extractedField;
}
Field is: Email and Type is: Error
Field is: Username and Type is: Error
Field is: InsertDate and Type is: Date
Field is: Age and Type is: Range