【问题标题】:Use Regex in this Linq query?在此 Linq 查询中使用正则表达式?
【发布时间】:2014-08-18 06:47:58
【问题描述】:

我正在使用这个 Linq 来查找列表中最高的 int,这样我就可以递增它并将其添加到下一个字符串的末尾:

var CableNumber = CList.Select(v => int.Parse(v.CableNumber.Substring(n))).Max();

但是,由于字符串不是固定长度,我想在其中插入一个Regex.Match,可能类似于:

n = Regex.Match(CableNumber, @"\d{3}", RegexOptions.RightToLeft);

指定;输入字符串遵循的唯一格式是它的末尾总是有一个 3 位数字,可能后跟一个字母。一些例子:

CP1-P-CP2-001 (001)
MOT1PSP2023A (023)
TKSP3-C-FLT2-234-A (234)

我该如何实现呢?有没有更好的办法?

【问题讨论】:

  • 您对哪一部分有问题?哪个不工作?
  • Regex 不能翻译成 linq 表达式,你可以做的是先执行查询到 IEnumerable<T>
  • 正则表达式是一个很好的方法。但是您的第三个示例与您在上面的句子中所写的内容相矛盾:234 后面没有单个字母。
  • @YuliamChandra 他没有提到SQL,所以不能翻译成查询应该没关系。
  • 抱歉,我将Linq query 误解为Linq to entities

标签: c# regex linq


【解决方案1】:

以下使用 linq 查询中的正则表达式模式:

string[] strings = { "CP1-P-CP2-001 (001)","MOT1PSP2023A (023)", "TKSP3-C-FLT2-234-A (234)",
                     "InvalidString" };

int? maxValue = strings.Max(x => 
{
    var match = Regex.Match(x, @"\d{3}(?=\D*$)");
    return match.Success ? (int?) int.Parse(match.Value) : null;
});

int? 是这样我们可以绕过任何从无效匹配返回的string.Empty,并且只解析有效匹配。如果没有匹配,将返回 null。

【讨论】:

  • 指定末尾括号中的数字(001), (023) 只是为了显示我想要的字符串的哪一部分。它们实际上并不是字符串本身的一部分。
  • "'System.Text.RegularExpressions.Regex.Match(string, int)'的最佳重载方法匹配有一些无效参数"
  • string, int?你能告诉我你传递给该方法的内容吗?你应该传递两个字符串。
  • 以及“不能从'char'转换成字符串'”和“不能从'字符串'转换成'int'”
  • 哎呀,对不起,我不小心把它放在了foreach 循环中
【解决方案2】:

这个怎么样?

var CableNumber = CList.Select(v => 
    int.Parse(v.CableNumber.Substring(v.CableNumber.Length - 3))).Max();

或者为了安全(防止字符串少于 3 个字符)。

var CableNumber = CList.Select(v => 
    int.Parse(("000" + v.CableNumber).Substring(("000" + v.CableNumber).Length - 3))).Max();

更新

使用LastIndexOfAny

var CableNumber = CList.Select(v => 
    int.Parse(v.CableNumber.Substring(v.CableNumber
        .LastIndexOfAny("0123456789".ToCharArray()) - 2, 3))).Max();

【讨论】:

  • 我想过这个,但不幸的是,这不允许在数字后面添加任何额外的字符 (-A)
  • 太棒了,现在我可以创建一个列表并从中获得最高数字:) 非常感谢
【解决方案3】:

您可以使用下一个正则表达式来获取每个字符串中的最后 3 位数字:

(\d{3})\D*$

【讨论】:

    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多