从文本字符串 c# 形成谓词
本文关键字:谓词 文本 字符串 | 更新日期: 2023-09-27 18:30:36
例如,我有以下模式:
- 输出{d}字节
- 在{d}字节
- In{d}bytesOut{d}bytes
- 出{d}词
- 词
- In{d}wordsOut{d}words,其中{d}是数字。
我不喜欢case
. 我怎么能根据这段文字形成这样的东西:
p => p.Out == 8 && p.In == 16 //In8bytesOut16bytes
p => p.Out == 8*8 && p.In == 4*8 // In8Out4words
p => p.In == 8 // In8bytes
正则表达式?任何建议都会有所帮助。提前谢谢。
Match match;
int inBytes = 0;
int outBytes = 0;
string pattern =
@"(?<InOut>In|Out)(?<inBytes>'d+)bytes((?<Out>Out)(? <outBytes>'d+)bytes)?";
Func<string, IService, bool> predicate;
match = Regex.Match(description, pattern);
if ((match.Groups[4].Length > 0))
{
int.TryParse(match.Groups[3].Value, out inBytes);
int.TryParse(match.Groups[5].Value, out outBytes);
predicate = p => p.In == inBytes && p.Out == outBytes;
}
输入是格式化字符串,取自文件。它应该满足上述模式之一。主要思想是从这个字符串中获取数字。有一个服务包含两个定义(以字节为单位)和输出(以字节为单位)。我需要解析这个字符串并提出一个条件。
例如,我得到In4bytesOut8bytes。我需要得到 4 和 8 并制定条件
看起来像Func<string, IService, bool> predicate = p => p.In == 4 && p.Out == 8
我建议你在这里使用规范模式而不是lambdas:
public class ServiceSpecification
{
private const int BytesInWord = 8;
public int? In { get; private set; }
public int? Out { get; private set; }
public static ServiceSpecification Parse(string s)
{
return new ServiceSpecification {
In = ParseBytesCount(s, "In"),
Out = ParseBytesCount(s, "Out")
};
}
private static int? ParseBytesCount(string s, string direction)
{
var pattern = direction + @"('d+)(bytes|words)";
var match = Regex.Match(s, pattern);
if (!match.Success)
return null;
int value = Int32.Parse(match.Groups[1].Value);
return match.Groups[2].Value == "bytes" ? value : value * BytesInWord;
}
public bool IsSatisfiedBy(IService service)
{
if (In.HasValue && service.In != In.Value)
return false;
if (Out.HasValue && service.Out != Out.Value)
return false;
return true;
}
}
您可以从输入字符串创建规范:
var spec = ServiceSpecification.Parse(text);
并检查是否有任何服务满足此规范:
var specs = new List<ServiceSpecification>
{
ServiceSpecification.Parse("In8bytesOut16bytes"),
ServiceSpecification.Parse("In8wordsOut4words"),
ServiceSpecification.Parse("In8bytes")
};
foreach(var spec in specs)
Console.WriteLine(spec.IsSatisfiedBy(service));