在此Linq查询中使用Regex?

时间:2014-08-18 06:47:59

标签: c# regex linq

我正在使用这个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)

我怎么能实现这个?还有更好的方法吗?

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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();

答案 2 :(得分:0)

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

(\d{3})\D*$