diff --git a/src/BootstrapBlazor/Components/Filters/StringFilter.razor.cs b/src/BootstrapBlazor/Components/Filters/StringFilter.razor.cs index f64fc977b59..9816101e4a1 100644 --- a/src/BootstrapBlazor/Components/Filters/StringFilter.razor.cs +++ b/src/BootstrapBlazor/Components/Filters/StringFilter.razor.cs @@ -49,7 +49,8 @@ protected override void OnParametersSet() new SelectedItem("Contains", Localizer["Contains"].Value), new SelectedItem("Equal", Localizer["Equal"].Value), new SelectedItem("NotEqual", Localizer["NotEqual"].Value), - new SelectedItem("NotContains", Localizer["NotContains"].Value) + new SelectedItem("NotContains", Localizer["NotContains"].Value), + new SelectedItem("Regex", Localizer["Regex"].Value) ]; } diff --git a/src/BootstrapBlazor/Components/QueryBuilder/QueryBuilder.razor.cs b/src/BootstrapBlazor/Components/QueryBuilder/QueryBuilder.razor.cs index 89cca2f4fe5..443281a6cb7 100644 --- a/src/BootstrapBlazor/Components/QueryBuilder/QueryBuilder.razor.cs +++ b/src/BootstrapBlazor/Components/QueryBuilder/QueryBuilder.razor.cs @@ -152,7 +152,8 @@ protected override void OnParametersSet() new SelectedItem("Equal", Localizer["Equal"].Value), new SelectedItem("NotEqual", Localizer["NotEqual"].Value ), new SelectedItem("Contains", Localizer["Contains"].Value ), - new SelectedItem("NotContains", Localizer["NotContains"].Value ) + new SelectedItem("NotContains", Localizer["NotContains"].Value ), + new SelectedItem("Regex", Localizer["Regex"].Value ) ]; } diff --git a/src/BootstrapBlazor/Enums/FilterAction.cs b/src/BootstrapBlazor/Enums/FilterAction.cs index cc1ab681ed7..5b5f7282103 100644 --- a/src/BootstrapBlazor/Enums/FilterAction.cs +++ b/src/BootstrapBlazor/Enums/FilterAction.cs @@ -69,6 +69,13 @@ public enum FilterAction [Description("不包含")] NotContains, + /// + /// 正则表达式匹配 + /// Regular expression match + /// + [Description("正则匹配")] + Regex, + /// /// 自定义条件 /// Custom Predicate diff --git a/src/BootstrapBlazor/Extensions/LambdaExtensions.cs b/src/BootstrapBlazor/Extensions/LambdaExtensions.cs index 58401fa3805..3726c8bf5e7 100644 --- a/src/BootstrapBlazor/Extensions/LambdaExtensions.cs +++ b/src/BootstrapBlazor/Extensions/LambdaExtensions.cs @@ -7,6 +7,7 @@ using System.Dynamic; using System.Linq.Expressions; using System.Reflection; +using System.Text.RegularExpressions; namespace System.Linq; @@ -241,6 +242,7 @@ private static Expression GetExpression(this FilterKeyValueAction filter, Expres FilterAction.LessThanOrEqual => Expression.LessThanOrEqual(left, right), FilterAction.Contains => left.Contains(right, comparison), FilterAction.NotContains => Expression.Not(left.Contains(right, comparison)), + FilterAction.Regex => left.RegexMatch(right), _ => filter.FieldValue switch { LambdaExpression t => Expression.Invoke(t, left), @@ -267,6 +269,12 @@ private static BinaryExpression ContainsWidthComparison(this Expression left, Ex return Expression.AndAlso(Expression.NotEqual(left, Expression.Constant(null)), Expression.Call(left, method, right, comparisonConstant)); } + private static MethodCallExpression RegexMatch(this Expression left, Expression right) + { + var method = typeof(Regex).GetMethod("IsMatch", [typeof(string), typeof(string)])!; + return Expression.Call(method, left, right); + } + #region Count /// /// Count 方法内部使用 Lambda 表达式做通用适配 可接受 IEnumerable 与 Array 子类 diff --git a/src/BootstrapBlazor/Locales/en.json b/src/BootstrapBlazor/Locales/en.json index 47f7aad6bc0..9d1540a5268 100644 --- a/src/BootstrapBlazor/Locales/en.json +++ b/src/BootstrapBlazor/Locales/en.json @@ -279,6 +279,7 @@ "NotEqual": "NotEqual", "Contains": "Contains", "NotContains": "NotContains", + "Regex": "Regex", "EnumFilter.AllText": "All", "NotSupportedColumnFilterMessage": "

Unsupported filter type, Please customize the filter use FilterTemplate

Please refer CustomFilter
", "MultiFilterSearchPlaceHolderText": "Please enter ...", @@ -377,6 +378,7 @@ "NotEqual": "NotEqual", "Contains": "Contains", "NotContains": "NotContains", + "Regex": "Regex", "GroupText": "Group", "ItemText": "Item" }, diff --git a/src/BootstrapBlazor/Locales/zh.json b/src/BootstrapBlazor/Locales/zh.json index cabcefdbfbd..95fc36b8c6a 100644 --- a/src/BootstrapBlazor/Locales/zh.json +++ b/src/BootstrapBlazor/Locales/zh.json @@ -279,6 +279,7 @@ "NotEqual": "不等于", "Contains": "包含", "NotContains": "不包含", + "Regex": "正则匹配", "EnumFilter.AllText": "全选", "NotSupportedColumnFilterMessage": "

不支持的类型,请使用 FilterTemplate 自定义过滤组件

请参考文档 CustomFilter
", "MultiFilterSearchPlaceHolderText": "请输入 ...", @@ -377,6 +378,7 @@ "NotEqual": "不等于", "Contains": "包含", "NotContains": "不包含", + "Regex": "正则匹配", "GroupText": "组合条件", "ItemText": "单行条件" },