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

use*_*454 4 c# regex

试图在字符串的最后一个破折号之后找到数字的最后一个实例

test-123-2-456 会回来 456

123-test 会回来 ""

123-test-456 会回来 456

123-test-456sdfsdf 会回来 456

123-test-asd456 会回来 456

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

p.s*_*w.g 5

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

(\d+)[^-]*$
Run Code Online (Sandbox Code Playgroud)

这将匹配在组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);
}
Run Code Online (Sandbox Code Playgroud)

产生:

(\d+)[^-]*$
Run Code Online (Sandbox Code Playgroud)

另外,如果您可以使用像这样的否定前瞻

\d+(?!.*-)
Run Code Online (Sandbox Code Playgroud)

只要不带连字符,这将匹配一个或多个数字字符。比赛中仅包含数字。

请注意,如果最后一个数字后面有两组或更多组数字,则这两个选项的行为会有所不同-,例如foo-123bar456。在这种情况下,您并不确定要发生什么,但是第一个模式将简单地匹配从第一个数字序列到末尾(123bar456)的所有内容,而第1组仅包含第一个数字序列(123)。如果您想更改此设置,使其仅捕获最后的数字序列,请\d在字符类(即(\d+)[^\d-]*$)内放置一个。第二个第二个模式将为每个序列数字(在本例中为123456)产生一个单独的匹配项,但是该Regex.Match方法只会给您第一个匹配项。