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

4
在字符串中查找最后一个破折号后面的数字,因此: test-123-2-456 将返回 456 123-test 将返回 "" 123-test-456 将返回 456 123-test-456sdfsdf 将返回 456 123-test-asd456 将返回 456 表达式@"[^-]*$"并不匹配数字,我尝试使用[\d]但是没有成功。
3个回答

6
当然,最简单的解决方案可能是这样的:
(\d+)[^-]*$

这将匹配一个或多个数字,捕获在第一组中,并跟随字符串的结尾之前的任何字符除了连字符,随后是零个或多个字符。换句话说,它将匹配任何数字序列,只要该序列和字符串结尾之间没有连字符即可。然后,您只需从匹配中提取第一组。例如:

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

另外,如果您想使用负向零宽断言,可以像这样:

\d+(?!.*-)

这将匹配一个或多个数字字符,只要它们不跟随连字符。匹配结果中只包含数字。

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


"test-123-dfg456" 匹配上述的 dfg456。 - user1853454
@user1853454 你需要提取第一组,我已经包含了一个例子。然而,我注意到我的原始模式存在问题;我在更新的答案中进行了更正。 - p.s.w.g
太好了,抱歉打扰了,你能否稍微解释一下?我会将你标记为正确答案。 - user1853454
@user1853454 我很乐意解释。你具体对哪个部分感到困惑? - p.s.w.g
我不明白为什么(\d+)在[^-]之前,我认为数字匹配应该在[^-]之后。 - user1853454
@user1853454 哎呀,我在上次编辑中更正了我的模式,但没有更正模式描述。希望我的更新答案有助于解释这里的逻辑。 - p.s.w.g

0

这个正则表达式的最新分组可以为您获取最后一个数字:

[^-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);

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


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