在.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
相关产品推荐
相关产品推荐

