【问题标题】:Linq select with regex使用正则表达式的 Linq 选择
【发布时间】:2019-10-22 19:14:09
【问题描述】:

我想从我的列表中提取像aaa.a1aaa.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 =&gt; x.Contains(@"aaa.")),因为这会在任何上下文中检查aaa.,而在这里检查单词边界是有意义的。

标签: c# regex linq


【解决方案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 =&gt; !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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2017-12-10
    • 2018-01-05
    • 2015-01-11
    • 2016-01-11
    • 2012-03-07
    • 2019-05-18
    相关资源
    最近更新 更多