如何从字符串中提取变量 我需要与另一个预先存在的字符串 c# 进行比较

本文关键字:字符串 存在 比较 另一个 提取 变量 | 更新日期: 2023-09-27 18:32:36

我有一个规则引擎,它将字符串作为规则的名称,并将其与字符串谓词字典进行比较。我正在编写一个规则,该规则将比较两个日期时间,如果它们匹配,则返回 true,但允许可配置秒数的窗口。理想情况下,我希望我的字符串/谓词键值对看起来像

{"Allow <x> seconds", AllowXSeconds}

应用规则的用户将决定他们希望在原始日期时间的两侧显示 10 秒的窗口,因此他们会在配置中说"允许 10 秒"。我希望我的代码能够识别用户想要应用"允许秒数"规则,然后拉出"10",以便我可以将其用作规则逻辑中的变量。我宁愿不使用正则表达式,因为该类已经构建好了,我不知道我是否被允许以这种方式重构它。不过,如果没有人对如何做到这一点有任何聪明的想法,我会的。提前感谢你们所有聪明的家伙和女孩!

如何从字符串中提取变量 我需要与另一个预先存在的字符串 c# 进行比较

您可以使用

string.StartsWithstring.EndsWith进行验证,然后使用string.Substring获取所需的值,int.TryParse尝试解析该值并验证它是否为整数

string str = "Allow 10 seconds";
int result;
if (str.StartsWith("Allow ") 
    && str.EndsWith(" seconds") 
    && int.TryParse(str.Substring(6, str.Length - 14), out result))
{
    Console.WriteLine(result);
}
else
{
    Console.WriteLine("Invalid");
}

此外,如果需要,还有StartsWithEndsWith的重载,这也允许不区分大小写的匹配。

这看起来像是正则表达式的完美候选者。

下面是一个演示的 LINQPad 程序:

void Main()
{
    var lines = new[]
    {
        "Allow 10 seconds",
        "Allow 5 seconds",
        "Use 5mb"
    };
    var rules = new Rule[]
    {
        new Rule(
            @"^Allow's+(?<seconds>'d+)'s+seconds?$",
            ma => AllowSeconds(int.Parse(ma.Groups["seconds"].Value)))
    };
    foreach (var line in lines)
    {
        bool wasMatched = rules.Any(rule => rule.Visit(line));
        if (!wasMatched)
            Console.WriteLine($"not matched: {line}");
    }
}
public void AllowSeconds(int seconds)
{
    Console.WriteLine($"allow: {seconds} second(s)");
}
public class Rule
{
    public Rule(string pattern, Action<Match> action)
    {
        Pattern = pattern;
        Action = action;
    }
    public string Pattern { get; }
    public Action<Match> Action { get; }
    public bool Visit(string line)
    {
        var match = Regex.Match(line, Pattern);
        if (match.Success)
            Action(match);
        return match.Success;
    }
}

输出:

allow: 10 second(s)
allow: 5 second(s)
not matched: Use 5mb