正则表达式匹配最后一个破折号后的所有数字

时间:2014-05-13 21:26:56

标签: c# regex

尝试在字符串中最后一个破折号后找到最后一个数字实例

test-123-2-456会返回456

123-test会返回""

123-test-456会返回456

123-test-456sdfsdf会返回456

123-test-asd456会返回456

表达式@"[^-]*$"虽然与数字不匹配,但我尝试使用[\ d]但无效。

3 个答案:

答案 0 :(得分:4)

当然,最简单的解决方案是这样的:

(\d+)[^-]*$

这将是在组1中捕获的一个或多个数字,后跟除连字符之外的任何字符的零个或多个,后跟字符串的结尾。换句话说,只要该序列与字符串结尾之间没有连字符,它就会匹配任何数字序列。然后你只需从比赛中提取第1组。例如:

var inputs = new[] {
    "test-123-2-456",
    "123-test",
    "123-test-456",
    "123-test-456sdfsdf",
    "123-test-asd456"
};
foreach(var str in inputs)
{
    var m = Regex.Match(str, @"(\d+)[^-]*$");
    Console.WriteLine("{0} --> {1}", str, m.Groups[1].Value);
}

产地:

test-123-2-456 --> 456
123-test --> 
123-test-456 --> 456
123-test-456sdfsdf --> 456
123-test-asd456 --> 456

或者,如果你可以使用这样的negative lookahead

\d+(?!.*-)

这将匹配一个或多个数字字符,只要它们后面没有连字符。匹配中只包含数字。

请注意,如果在最后一个-之后有两组或更多组数字,则这两个选项的行为会有所不同,例如: foo-123bar456。在这种情况下,它并不完全清楚你想要发生什么,但第一个模式将简单地匹配从第一个数字序列开始到结束(123bar456)的所有内容,其中第1组仅包含第一个序列数字(123)。如果您想要更改它以便它只捕获最后一个数字序列,请在字符类中放置\d(即(\d+)[^\d-]*$)。第二个模式将为每个序列数字生成单独的匹配(在此示例中为123456),但Regex.Match方法仅为您提供第一个匹配。

答案 1 :(得分:0)

此RegEx的最新群组可以为您获取最后一个号码:

[^-A-z][0-9]+[^A-z]

如果您正在查看群组,可以通过匹配群组来编写此代码以获取最新的数字:

var inputs = new[] {
    "test-123-2-456",
    "123-test",
    "123-test-456",
    "123-test-456sdfsdf",
    "123-test-asd456"
};


 var m = Regex.Match(str, @"([0-9]*)");
 if(m.Groups.Length>1) //This will avoid the values starting with numbers only.
   Console.WriteLine("{0} --> {1}", str, m.Groups[m.Groups.Length-1].Value);

答案 2 :(得分:0)

我建议应用两个正则表达式函数。取第一个的结果作为第二个的输入。

第一个正则表达式是:

-[0-9]+[^-]+$    // Take the last peace of your string lead by a minus (-)
                 // followed by digits ([0-9]+)
                 // and some ugly rest that doesn't contain another minus ([^-]+$) 

第二个正则表达式是:

-[0-9]+          // Seperate the relevant digits from the ugly rest
                 // You know that there can only be one minus + digits part in it

在这里测试:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx