首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用*进行筛选,这将限制所有以Null开头的值?

使用*进行筛选,这将限制所有以Null开头的值?
EN

Stack Overflow用户
提问于 2015-04-15 18:58:51
回答 3查看 162关注 0票数 4

我有以下代码,它扩展了我的过滤器功能,允许我搜索多个邮政编码。例如。(1254,125,145,1455)

当前代码:

代码语言:javascript
复制
if (Post_Code_PAR != null)
{
    String[] PostCode_Array = Post_Code_PAR.Split(',');
    query = from p in query where PostCode_Array.Contains(p.Post_Code) select p;
}

我想以一种方式扩展这个代码,如果我给它类似( 0 *)的东西,它会找到从0开始的邮政编码。如果我给它123*,它会给我所有以123开头的邮政编码。非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2015-04-15 19:25:26

使用正则表达式:

示例:

代码语言:javascript
复制
IEnumerable<string> allInputs = new[] {"70000", "89000", "89001", "90001"};
string commaSeparatedPostCodePatterns = @"89000 , 90\d\d\d";

if (string.IsNullOrWhiteSpace(commaSeparatedPostCodePatterns)) 
    return;

string[] postCodePatterns = commaSeparatedPostCodePatterns
                                .Split(',')
                                .Select(p => p.Trim()) // remove white spaces
                                .ToArray();

var allMatches = 
    allInputs.Where(input => postCodePatterns.Any(pattern => Regex.IsMatch(input, pattern)));

foreach (var match in allMatches)
    Console.WriteLine(match);

对于这样的问题,初始需求非常简单,但很快就会变得越来越复杂(由于国际化,规则的例外,一些智能测试人员测试意外的极限情况,如90§$% ...)。因此,正则表达式提供了简单性与可扩展性的最佳折衷。

等同于*的正则表达式是.*。但在您的示例中,您宁愿使用更多限制性模式,并使用与单个数字匹配的\d占位符。可选数字为\d?。零个或多个数字将为\d*。一个或多个数字将是\d+。有关更多详细信息,请参阅文档。

票数 3
EN

Stack Overflow用户

发布于 2015-04-15 19:47:04

您可以将*替换为\d*,这基本上是Regex表示“任意数量的数字”的方式。然后运行并使用Regex.IsMatch()进行过滤。

代码语言:javascript
复制
if (Post_Code_PAR != null)
{
    var PostCode_Array = from p in Post_Code_PAR.Split(',') select String.Format("^{0}$", p.Replace("*", @"\d*"));
    query = (from p in query where PostCode_Array.Any(pattern => Regex.IsMatch(p.Post_Code, pattern)) select p).ToArray();
}

我试着让它尽可能接近你的代码,但是你可以把它清理一下,用lambda代替。但这应该也能正常工作:)

票数 3
EN

Stack Overflow用户

发布于 2015-04-15 19:06:38

代码语言:javascript
复制
string Post_Code_PAR = "";
String[] PostCode_Array = Post_Code_PAR.Split(',');
var zipCodeList = query.Where(x => CustomFilter(x.Post_Code, PostCode_Array)).ToList();

private static bool CustomFilter(string code, string[] foundZipCodes)
{
    return foundZipCodes.Any(x =>
   {
       x = x.Trim();
       var text = x.Replace("*", "");
       if (x.EndsWith("*"))
           return code.StartsWith(text);
       if (x.StartsWith("*"))
           return code.EndsWith(text);
       if (x.Contains("*"))
           return false;
       return code.StartsWith(text);
    });

}

现在用户可以找到:"0*,*52“等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29648425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档