You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.NET Core OData接口中对String.Join结果应用Regex.Match筛选指定值

搞定OData接口中FileStore字段的正则筛选需求

嘿,我懂你现在的场景:在.NET Core OData接口里处理IEnumerable类型的FileStore字段,原本用string.Join转成字符串导出Excel,现在只想保留匹配"MKOIP-P0"的内容对吧?

我给你两种方案,看哪种更贴合你的实际需求:

方案一:拼接前先筛选(推荐)

这种方式更高效,也更清晰——直接在拼接成字符串之前,就把符合条件的Filestore项筛选出来,避免先拼接再处理的冗余操作。

修改后的代码如下:

using System.Text.RegularExpressions; // 别忘了引用这个命名空间

return Ok(_assetDiscoveryService.GetAllAssets(tenantGuid)
    .Select(a => new ODataAsset 
    { 
        FileStore = a.Type == "VMWare.Compute/virtualMachines" 
            ? string.Join(",", 
                a.VSphereSpecificInfo.DiskInfo
                    .Select(b => b.Filestore)
                    // 这里筛选出匹配"MKOIP-P0"的项
                    .Where(fs => Regex.IsMatch(fs, @"MKOIP-P0")))
            : null, 
    }).AsQueryable());

细节调整

  • 如果需要精准匹配以"MKOIP-P0"开头的项,把正则改成@"^MKOIP-P0";如果只是包含这个字符串,用@"MKOIP-P0"就足够。
  • 要是你的Filestore格式很固定,甚至不用正则,直接用StartsWith性能更好:
    .Where(fs => fs.StartsWith("MKOIP-P0"))
    

方案二:拼接后提取匹配项(特殊场景用)

如果因为某些原因必须先拼接成完整字符串,再从中提取符合条件的内容,那可以用Regex.Matches来捕获所有匹配项,再重新拼接:

using System.Text.RegularExpressions;

return Ok(_assetDiscoveryService.GetAllAssets(tenantGuid)
    .Select(a => new ODataAsset 
    { 
        FileStore = a.Type == "VMWare.Compute/virtualMachines" 
            ? 
                (() => {
                    var rawString = string.Join(",", a.VSphereSpecificInfo.DiskInfo.Select(b => b.Filestore));
                    // 匹配所有包含"MKOIP-P0"的完整项(直到下一个逗号或字符串结束)
                    var matches = Regex.Matches(rawString, @"MKOIP-P0[^,]*");
                    return matches.Count > 0 ? string.Join(",", matches.Select(m => m.Value)) : null;
                })()
            : null, 
    }).AsQueryable());

这里用了一个匿名函数来封装逻辑,让代码更整洁。正则@"MKOIP-P0[^,]*"会确保你拿到的是完整的Filestore项,而不是片段。

内容的提问来源于stack exchange,提问作者HJain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:05:46