在这个 Linq 查询中使用正则表达式?

3

我使用这个Linq查找列表中最高的整数,以便我可以将其递增并添加到下一个字符串的末尾:

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

然而,由于这些字符串的长度不固定,我考虑在其中插入一个 Regex.Match,可能是这样的:

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

为了说明,输入字符串遵循的唯一格式是其最后始终有一个三位数,可能跟随一个字母。以下是一些例子:
CP1-P-CP2-001 (001)
MOT1PSP2023A (023)
TKSP3-C-FLT2-234-A (234)

我该如何实现这个功能?有更好的方法吗?

3
你遇到了哪个部分的问题?哪一个没有起作用? - Sriram Sakthivel
“Regex” 无法转换为 Linq 表达式,您可以先将查询执行到 “IEnumerable<T>” 中。 - Yuliam Chandra
1
正则表达式是一个不错的选择。但是你的第三个例子与你在上面写的相矛盾:234后面不跟随单个字母。 - Dirk
1
@YuliamChandra他没有提到SQL,所以它无法被翻译成查询也就不重要了。 - Dirk
抱歉,我误解了 Linq 查询Linq to entities - Yuliam Chandra
@SriramSakthivel 我正在尝试弄清楚如何获取可变字符串长度的位置(Substring(n))。例如,Substring(10) 只适用于第一个字符串,但不适用于其他字符串。 - Ben
3个回答

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) 仅用于显示我想要的字符串的哪一部分,它们实际上并不是字符串本身的一部分。 - Ben
"System.Text.RegularExpressions.Regex.Match(string, int)" 的最佳重载方法匹配存在一些无效的参数。" - Ben
“string, int”? 你能给我展示一下你传递给方法的参数吗?你应该传递两个字符串。 - Yuval Itzchakov
以及“无法从'char'转换为字符串”和“无法从'string'转换为'int'”。 - Ben
你可能传递了一个不同的列表,而不是我展示的那个。请给我展示你使用的代码。 - Yuval Itzchakov
1
抱歉,我不小心将它放在一个 'foreach' 循环中。 - Ben

0

这个怎么样?

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”)后面跟随任何额外的字符。 - Ben
太棒了,现在我可以创建一个列表并从中获取最大的数字 :) 非常感谢! - Ben

0
您可以使用以下正则表达式来获取每个字符串中的最后3位数字:
(\d{3})\D*$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接