如何从字符串中提取变量 我需要与另一个预先存在的字符串 c# 进行比较
本文关键字:字符串 存在 比较 另一个 提取 变量 | 更新日期: 2023-09-27 18:32:36
我有一个规则引擎,它将字符串作为规则的名称,并将其与字符串谓词字典进行比较。我正在编写一个规则,该规则将比较两个日期时间,如果它们匹配,则返回 true,但允许可配置秒数的窗口。理想情况下,我希望我的字符串/谓词键值对看起来像
{"Allow <x> seconds", AllowXSeconds}
应用规则的用户将决定他们希望在原始日期时间的两侧显示 10 秒的窗口,因此他们会在配置中说"允许 10 秒"。我希望我的代码能够识别用户想要应用"允许秒数"规则,然后拉出"10",以便我可以将其用作规则逻辑中的变量。我宁愿不使用正则表达式,因为该类已经构建好了,我不知道我是否被允许以这种方式重构它。不过,如果没有人对如何做到这一点有任何聪明的想法,我会的。提前感谢你们所有聪明的家伙和女孩!
您可以使用
string.StartsWith
和string.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");
}
此外,如果需要,还有StartsWith
和EndsWith
的重载,这也允许不区分大小写的匹配。
这看起来像是正则表达式的完美候选者。
下面是一个演示的 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