使用正则表达式的 Linq 选择
Posted
技术标签:
【中文标题】使用正则表达式的 Linq 选择【英文标题】:Linq select with regex 【发布时间】:2019-10-22 19:14:09 【问题描述】:我想从我的列表中提取像aaa.a1
和aaa.a2
这样的字符串。所有这些字符串都包含"aaa."
。
如何将 Regex 与 Linq 结合使用?
var inputList = new List<string>() "bbb aaa.a1 bbb", "ccc aaa.a2 ccc" ;
var result = inputList.Where(x => x.Contains(@"aaa.")).Select(x => x ???? ).ToList();
【问题讨论】:
长度是固定的吗?还是后面总是有空格? 不,它是可变的。但总有一个空间。 从您的示例中,它看起来前后总是有一个空格,所以为什么不使用 string.split(" ") 并检查是否有任何子字符串包含“aaa” 出于进一步提取的原因,我需要正则表达式。 如果您对我的解决方案有任何疑问,请告诉我。我认为你不能依赖.Where(x => x.Contains(@"aaa."))
,因为这会在任何上下文中检查aaa.
,而在这里检查单词边界是有意义的。
【参考方案1】:
你可以使用
var inputList = new List<string>() "bbb aaa.a1 bbb", "ccc aaa.a2 ccc" ;
var result = inputList
.Select(i => Regex.Match(i, @"\baaa\.\S+")?.Value)
.Where(x => !string.IsNullOrEmpty(x))
.ToList();
foreach (var s in result)
Console.WriteLine(s);
输出:
aaa.a1
aaa.a2
见C# demo
Regex.Match(i, @"\baaa\.\S+")?.Value
部分尝试匹配每个项目中的以下模式:
\b
- 单词边界
aaa\.
- aaa.
子字符串
\S+
- 1+ 非空白字符。
.Where(x => !string.IsNullOrEmpty(x))
将丢弃由没有匹配字符串的项目产生的空项目。
【讨论】:
【参考方案2】:您可以尝试稍微不同的解决方案:
var result = inputList
.Where(i => Regex.Match(i, @"\baaa\.[a-z0-9]+")?.Success)
// or even
// .Where(i => Regex.Match(i, @"\ba+\.[a-z0-9]+")?.Success)
【讨论】:
我也喜欢你的解决方案。 :D以上是关于使用正则表达式的 Linq 选择的主要内容,如果未能解决你的问题,请参考以下文章