【问题标题】:Searching by regexp when constructing LINQ expression using Expression classes使用表达式类构造 LINQ 表达式时按正则表达式搜索
【发布时间】:2023-03-20 19:11:01
【问题描述】:

Here 是描述动态创建Expression<Func<MyClass, bool>> 谓词的方法的帖子。这是一个sn-p:

 var param = Expression.Parameter(typeof(string), "p");
    var len = Expression.PropertyOrField(param, "SomeText");
    var body = Expression.Equal(
        len, Expression.Constant("Text"));

    var lambda = Expression.Lambda<Func<string, bool>>(
        body, param);

我想知道如何将正则表达式应用于字符串而不是 Equality。有没有可能? 可能的伪代码如下:

 var param = Expression.Parameter(typeof(string), "p");
    var len = Expression.PropertyOrField(param, "SomeText");
    var body = Expression.Regexp(
        len, @"\D+");

    var lambda = Expression.Lambda<Func<string, bool>>(
        body, param);

【问题讨论】:

    标签: c# .net lambda


    【解决方案1】:

    您可以使用Expression.Call(Type type, string methodName, Type[] typeArguments, params Expression[] arguments) 调用检查正则表达式的测试方法。

     List<string> lista = new List<string>() { "aaaa", "aaabb", "aaacccc", "eee" };
    
            var param = Expression.Parameter(typeof(string), "s");
            var pattern = Expression.Constant("\\Aa");
    
            var test = Expression.Call(typeof(Regex), "IsMatch", null, param, pattern);
    
            var lambda = Expression.Lambda<Func<string, bool>>(test, param);
    
            IEnumerable<string> query = lista.Where(lambda.Compile());
    
            foreach (string s in query) 
            {
                Console.WriteLine(s);
            }
    

    【讨论】:

    • 这个字符串是从哪里来的——“IsMatch”?
    • 假设你有以下结构 var data = new List { new TestClass {Name = "valvoline", Quantity = 3}, new TestClass {Name = "castrol", Quantity = 3} , new TestClass {Name = "valve", Quantity = 1}, };并且您想使用下一个条件进行搜索 var queryItems = new List { new QueryItem {Caption = "Name", Value = "v*", Separator = NextItem.Last};
    • @Hohhi isMatch 是正则表达式的一种方法。在您最初的问题中,您询问了正则表达式检查。
    • 在这个例子中如何进行正则表达式替换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多